Calcola la frequenza di ogni voce di prima.
{
apples: 1,
oranges: 4,
bananas: 2
}
Quindi creare un array da questo oggetto di frequenza che rimuoverà anche i duplicati.
["apples", "oranges", "bananas"]
Ora ordina questo array in ordine decrescente utilizzando la mappa di frequenza creata in precedenza.
function compareFrequency(a, b) {
return frequency[b] - frequency[a];
}
array.sort(compareFrequency);
Ecco l'intera sorgente (utilizzando la recente introduzione Array functions in ECMA 5) e combinando le fasi di generazione de-duplicazione e sugli frequenza,
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];
});
}
Idem come sopra usando il normale iterazione matrice.
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);
}
può valere la memorizzazione nella cache Array.length invece di controllo su ciascuna iterazione – second
@secondo: si tratta di una buona ottimizzazione per dataset di grandi dimensioni. Alcuni browser potrebbero già farlo internamente. – Anurag
Probabilmente è elegante come lo troverete. – palswim