вычисления частоты каждого элемента первой.
{
apples: 1,
oranges: 4,
bananas: 2
}
Затем создайте массив из этого частотного объекта, который также удалит дубликаты.
["apples", "oranges", "bananas"]
Теперь отсортируйте этот массив в порядке убывания с использованием частотной карты, которую мы создали ранее.
function compareFrequency(a, b) {
return frequency[b] - frequency[a];
}
array.sort(compareFrequency);
Вот весь источник (с использованием вновь вводимых Array functions в ECMA 5) и объединения шагов генерации де-дублирования и карты частот,
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];
});
}
же, как описано выше, используя регулярные итерации массива.
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);
}
может стоить кэширования array.length вместо проверки на каждой итерации – second
@ секунда - это хорошая оптимизация для больших наборов данных. Возможно, некоторые браузеры уже делают это внутри. – Anurag
Это, наверное, так же изящно, как вы найдете. – palswim