对数组元素进行计数并按计数降序排序

Counting array elements and sort descending by count

本文关键字:降序 排序 数组元素      更新时间:2023-09-26

阵列:

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

理想输出:

2, 3, 5, 9, 4

PHP通过array_count_values()arsort()简化了这一点,但事实证明javascript有点困难。有什么帮助吗?


此外,还可以返回包含计数的信息吗?针对未来需求

计算唯一条目,创建一个uniques数组,然后根据计数进行排序

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