Contare gli elementi di matrix e ordinare discendendo per count

Array:

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

Produzione ideale:

 2, 3, 5, 9, 4 

PHP ha reso questo semplice con arrays_count_values() e arsort() , ma il javascript sta dimostrando un po 'più duro. Qualsiasi aiuto?


Inoltre, che dire di restituirlo contenente anche i conti? Per esigenze future

Contare le voci univoche, creare una serie di uniques, poi ordinare in base ai conteggi

 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] 

L'esempio ha entrambi uno 9 e uno 4 , quindi se si desidera che l'ordine definito, sarebbe necessario un lavoro maggiore. Altrimenti;

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

Per produrre un arrays di oggetti

 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} ] */ 

Adesso, per get il valore dell'indice i , si result[i].value e per il suo result[i].weight ponderazione result[i].weight .