数组:
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/