在Javascript中从数组中选择最重复的m个元素

时间:2014-12-27 12:56:33

标签: javascript arrays

假设我有一个包含n元素的数组,其中一些可能会出现多次。

我想选择该数组中最常出现的顶级m元素。

有人可以帮我吗?

例如,假设数组为[1, 3, 2, 3, 5, 2, 2, 3, 6, 8, 9]且带有n=11个元素。如果我想选择它们的前m=2,则会23

最好的脚本是什么?

2 个答案:

答案 0 :(得分:2)

您可以创建一个临时对象来保存key: count之类的事件。然后使用Object.keys返回的数组对对象值进行排序。然后slice.reverse()顺序排列该数组中的最后一个“ n ”元素。

以下是一个示例实用程序函数,用于获取 top n max 次出现。 注意:正如评论中所述的@n 6 ,这忽略了关系。

演示小提琴:http://jsfiddle.net/abhitalks/s43k6vsq/

<强>

var data1 = [1, 3, 2, 3, 5, 2, 2, 3, 6, 8, 9], 
    data2 = [4, 4, 4, 2, 2, 1, 5, 5, 8, 8, 8, 8, 3], 
    data3 = [3, 23, 23, 45, 54, 54, 54];


// Function parameters = Data Array and top "n" elements to find
function getMax(data, n) {
    var tmp = {}, tops = [];
  
    // Create object with count of occurances of each array element
    data.forEach(function(item) {
        tmp[item] = tmp[item] ? tmp[item]+1 : 1;
    });
  
    // Create an array of the sorted object properties
    tops = Object.keys(tmp).sort(function(a, b) { return tmp[a] - tmp[b] });
  
    // Return last n elements in reverse order
    return tops.slice(-(n)).reverse();
}

// Test with sample data and top "n" 
snippet.log(getMax(data1, 2));
snippet.log(getMax(data2, 3));
snippet.log(getMax(data3, 1));
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

*使用TJ Crowder的脚本将 console.log发送到snippet.log 。请参见此处:https://meta.stackexchange.com/a/242144/230147和此处:https://meta.stackexchange.com/a/242144/134069

答案 1 :(得分:1)

解决方案:

var arr = [1,2,3,41,11,2,3,4,1];
var sorted = [];

for (var i = 0; i < arr.length; i++) {
    var index = -1;

    for (var j = 0; j < sorted.length; j++) {
        if (sorted[j].val == arr[i]) index = j;
    }

    if (index == -1) {
        sorted.push({val: arr[i], count: 1})
    }

    else {
        sorted[index].count++;
    }

}

console.log(sorted.sort(function(a,b){

if (a.count > b.count) return -1;

if (a.count < b.count) return 1

    return 0

})[0])

FIDDLE