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