Javascript 计数数组元素并按计数降序排序

Javascript 计数数组元素并按计数降序排序,javascript,arrays,sorting,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_值和arsort简化了这一过程,但javascript的难度更大。有什么帮助吗 另外,返回包含计数的数据怎么样?对于未来的需要对唯一条目进行计数,创建一个unique数组,然后根据计数进行排序 function count(arr) { // count occurances var o = {}, i; for

数组:

5, 5, 5, 9, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3
理想输出:

2, 3, 5, 9, 4
PHP通过array_count_值和arsort简化了这一过程,但javascript的难度更大。有什么帮助吗


另外,返回包含计数的数据怎么样?对于未来的需要

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

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]
生成一个对象数组


现在,要获取索引i处的值,需要执行result[i].value,并对其加权结果[i].weight.

对唯一项进行计数,创建一个unique数组,然后根据计数进行排序

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]
生成一个对象数组



现在,要获得索引i处的值,需要执行结果[i].value,并对其加权结果[i].weight.

检查接受的答案。当然,还有一种.sort方法。您是否要删除重复项?您的意思是按计数递减?2是最常见的事件…@Floris是的,下降。@aaronman是的。但首先要计算发生次数并进行排序。检查已接受的答案。当然,还有一种.sort方法。您是否要删除重复项?您的意思是按计数递减?2是最常见的事件…@Floris是的,下降。@aaronman是的。但首先要计算出现次数和排序。我是否也可以得到每个值的计数输出?不,我是说2:5,3:4,5:3,9:1,4:1我已经试了好几个小时了,但我似乎不能正确地修改它。你不是很清楚,2:5,3:4,5:3,9:1,4:1没有意义;你是说对象{2:5,3:4,4:1,5:3,9:1}?这是count返回的值。或者,您可能需要像[{value:2,weight:5},{value:3,weight:4}/*等]这样的对象数组,此后您将始终需要使用该数组指定是需要值还是权重。在我看来,使用对象更容易,因为如果您需要,可以将其作为字典查找,并且不需要更多的代码:是的,我希望它作为对象的排序数组,以便更容易进行迭代。我来自PHP,所以我在这方面遇到了一些问题。我还可以得到每个值的计数输出吗?不,我是说2:5,3:4,5:3,9:1,4:1我已经试了好几个小时了,但我似乎不能正确地修改它。你不是很清楚,2:5,3:4,5:3,9:1,4:1没有意义;你是说对象{2:5,3:4,4:1,5:3,9:1}?这是count返回的值。或者,您可能需要像[{value:2,weight:5},{value:3,weight:4}/*等]这样的对象数组,此后您将始终需要使用该数组指定是需要值还是权重。在我看来,使用对象更容易,因为如果您需要,可以将其作为字典查找,并且不需要更多的代码:是的,我希望它作为对象的排序数组,以便更容易进行迭代。我来自PHP,所以在这方面有点问题。
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}
] */