2013-08-02 2 views
2

массива:элементы Counting массив и сортировать по убыванию по количеству

5, 5, 5, 9, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3 

Ideal Выходные:

2, 3, 5, 9, 4 

PHP сделал это легко с array_count_values() и arsort(), но Javascript оказывается немного сложнее. Любая помощь?


Кроме того, как насчет возврата его с подсчетами? Для будущих потребностей

+2

Ознакомьтесь с принятым ответом [здесь] (http://stackoverflow.com/questions/1960473/unique-values-in-an-array). Тогда, конечно, существует метод .sort(). – Xynariz

+0

Вы удаляете дубликаты – aaronman

+2

Вы имели в виду сказать "по убыванию по количеству"? Наиболее часто встречающееся '2' ... – Floris

ответ

3

Count уникальных записей, создать массив уников, затем сортировать на основании подсчетов

function count(arr) { // count occurances 
    var o = {}, i; 
    for (i = 0; i < arr.length; ++i) { 
     if (o[arr[i]]) ++o[arr[i]]; 
     else o[arr[i]] = 1; 
    } 
    return o; 
} 

function weight(arr_in) { // unique sorted by num occurances 
    var o = count(arr_in), 
     arr = [], i; 
    for (i in o) arr.push(+i); // fast unique only 
    arr.sort(function (a, b) { 
     return o[a] < o[b]; 
    }); 
    return arr; 
} 

weight([1, 3, 3, 5, 5, 5, 2, 2, 2, 2]); 
// one 1, two 3s, three 5s, four 2s 
// [2, 5, 3, 1] 

Вы пример имеет как один 9 и один 4, поэтому, если вы хотите заказ, определенный, больше работы будет необходимо. В противном случае;

weight([5, 5, 5, 9, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3]); 
// [2, 3, 5, 4, 9] 

производить составлять список присяжных заседателей из объектов

function weight(arr_in) { // unique sorted by num occurances 
    var o = count(arr_in), 
     arr = [], i; 
    for (i in o) arr.push({value: +i, weight: o[i]}); // fast unique only 
    arr.sort(function (a, b) { 
     return a.weight < b.weight; 
    }); 
    return arr; 
} 

var result = weight([5, 5, 5, 9, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3]); 
/* [ 
    {"value": 2, "weight": 5}, 
    {"value": 3, "weight": 4}, 
    {"value": 5, "weight": 3}, 
    {"value": 4, "weight": 1}, 
    {"value": 9, "weight": 1} 
] */ 

Теперь, чтобы получить значениепо индексу i, вы result[i].value, и это взвешивание result[i].weight.

+0

Мог ли я получить результат с подсчетом каждого значения? Для дальнейшего использования. – GameDevGuru

+0

Конечно, используйте 'count' или внесите изменения в код –

+0

Нет, я имею в виду' 2: 5, 3: 4, 5: 3, 9: 1, 4: 1' – GameDevGuru

Смежные вопросы