javascript - 计算数组元素并按计数降序排序

标签 javascript arrays sorting

数组:

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 有点困难。有什么帮助吗?


另外,返回包含计数的值怎么样?为了将来的需要

最佳答案

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

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,并为其加权结果[i].weight.

关于javascript - 计算数组元素并按计数降序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18007214/

相关文章:

arrays - 如何使用 sorted 对元组数组进行排序? (无法使用类型参数列表调用 'sorted')

javascript - 在for循环JavaScript中将键的值从数组推送到另一个数组

javascript - HTML 表格导出到 Excel(XLS 或 CSV)

javascript - 将 AngularJs Widget 集成到 Adob​​e Captivate 中

JavaScript:不区分大小写的数组搜索

javascript - 如何从数组对象中返回多个值作为新变量?

Java 泛型绑定(bind)不匹配

c - 合并函数(合并排序)中的错误

java - 错误 : Array required, 但找到 Vector<Double>?

c++ - C++ 中的 cout 没有打印出数组的值