Berechnen Sie die Frequenz der einzelnen Elemente zuerst.
{
apples: 1,
oranges: 4,
bananas: 2
}
Dann erstellen Sie ein Array von diesem Frequenzobjekt, das auch die Duplikate entfernt.
["apples", "oranges", "bananas"]
Jetzt sortieren Sie dieses Array in absteigender Reihenfolge mit der Frequenzkarte, die wir zuvor erstellt haben.
function compareFrequency(a, b) {
return frequency[b] - frequency[a];
}
array.sort(compareFrequency);
Hier ist die gesamte Quelle (die neu eingeführte Array functions in ECMA 5 verwendet wird) und Kombinieren der De-Duplikation und -frequenz Kartenerzeugungsschritte,
function sortByFrequency(array) {
var frequency = {};
array.forEach(function(value) { frequency[value] = 0; });
var uniques = array.filter(function(value) {
return ++frequency[value] == 1;
});
return uniques.sort(function(a, b) {
return frequency[b] - frequency[a];
});
}
Wie oben, die regelmäßige Anordnung Iteration verwendet wird.
function sortByFrequencyAndRemoveDuplicates(array) {
var frequency = {}, value;
// compute frequencies of each value
for(var i = 0; i < array.length; i++) {
value = array[i];
if(value in frequency) {
frequency[value]++;
}
else {
frequency[value] = 1;
}
}
// make array from the frequency object to de-duplicate
var uniques = [];
for(value in frequency) {
uniques.push(value);
}
// sort the uniques array in descending order by frequency
function compareFrequency(a, b) {
return frequency[b] - frequency[a];
}
return uniques.sort(compareFrequency);
}
wert sein kann, das Caching array.length statt Überprüfung auf jede Iteration – second
@second - das ist eine gute Optimierung für große Datensätze. Einige Browser tun dies möglicherweise bereits intern. – Anurag
Das ist wahrscheinlich so elegant, wie Sie finden werden. – palswim