如何获取 javascript 数组中出现次数最高的前 5 个元素(模式)



我想在 JavaScript 数组中获取出现次数(模式)最高的前 5 个元素。我找到了如何获取最高元素的片段,但不是前 5 名或前 10 名。

以下是获得最高出现次数的代码片段:

if(!Object.values) Object.values = function(ob){
var arr = [];
for(var k in ob) 
    if(ob.hasOwnProperty(k))
        arr.push(ob[k]);
return arr;
};
function multiMode(arr){
var map = arr.reduce(function(map, item){
    if(!(item in map)) map[item] = 0;
    return map[item]++, map;
}, {});
var max = Math.max.apply(null, Object.values(map)),
    arr2 = [];
Object.keys(map).forEach(function(k){
    if(map[k] === max) arr2.push(k);  
});
return arr2;
}
console.log(multiMode(['pear', 'apple', 'orange', 'apple', 'pear', 'pear', 'apple','apple']));

//Returns apple

首先,构建键 => 计数条目的映射

let counts = arr.reduce((map, fruit) => {
    map[fruit] = (map[fruit] || 0) + 1;
    return map;
}, {});

然后从键创建一个排序数组

let sorted = Object.keys(counts).sort((a, b) => counts[b] - counts[a]);

然后拿前5个

let top5 = sorted.slice(0, 5);

旧版本(如果需要)

var counts = arr.reduce(function(map, fruit) {
    map[fruit] = (map[fruit] || 0) + 1;
    return map;
}, {});
var sorted = Object.keys(counts).sort(function(a, b) {
    return counts[b] - counts[a];
});
var top5 = sorted.slice(0, 5);

JSBin Example

var a = [1,2,3,4,5,1,2,3,4,5,6,7,8,9,1,2,3,4,6,6,6,7,5];
// make map:
var m = a.reduce(function(a, b) {
  a[b] = ++a[b] || 1;
  return a;
}, {});
// loop through object, get array of keys/values:
var arr = [];
for (var key in m) {
  arr.push([key, m[key]]);
}
// sort array by values:
arr.sort(function(a, b) {
  return a[1] - b[1];
});
// slice and map over 5 highest and return value:
console.log(arr.slice(-5).map(function(e) {
  return e[0];
}));

最新更新