使用JavaScript在数组中查找最大量的重复值

时间:2013-02-08 00:32:25

标签: javascript jquery underscore.js

我有一个重复值的数组:

[0, 1, 6, 0, 1, 0]

返回特定值重复的最高金额的有效方法是什么?

在示例数组中,我希望脚本返回3,因为数字0重复次数最多且重复3次。 我已经在使用jQuery和Underscore了。

4 个答案:

答案 0 :(得分:2)

如果您使用lodash ...

_.max(_.countBy(a,_.identity))

有关lodash的更多信息:http://lodash.com/

答案 1 :(得分:1)

这类似于基本方法,但使用下划线的reducemax函数。如果你有一个真正非常大的数组,我希望你能清楚地知道如何在reduce之前将它与map阶段并行化。

var arr = [1,0,2,3,4,0,3,0];
var counts = _.reduce(arr, function(counts, val) {
    if (counts[val]) {
        counts[val]++;
    } else {
        counts[val] = 1;
    }
    return counts;
}, {});
return _.max(counts);

答案 2 :(得分:0)

是的,这就像谷歌面试问题大声笑。我建议循环一次你的数组并保持每个元素的关联数组,因为你在增加一个计数器时会遇到它。

例如:

http://jsfiddle.net/btKjX/

var a = [0, 0 , 2, 2, 3, 3, 3, 3];
var counts = {};

for(var i = 0, il = a.length; i < il; i++){
    var num = a[i];

    if(typeof counts[num] === 'undefined'){
        counts[num] = 0;
    }

    counts[num]++;
}

var max = -1;

for(var c in counts){
    if(counts[c] > max){
        max = counts[c];
    }
}

console.log(max);

答案 3 :(得分:0)

一个hacky方式可能是对它进行排序,在每次更改值时将其拆分,然后查看每个字符串的长度,但让我们尝试一些更合理的方法:

var nums = [0, 1, 6, 0, 1, 0]
var occurence = {}
$.each(nums, function(a, num_id) {
  if (occurence[num_id] != null) {
    occurence[num_id]++;
  } else {
    occurence[num_id] = 1;
  }
});
然后,

出现会产生nums中每个值的出现次数,数字本身就是关键。