0

我有一个重复值的数组:

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

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

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

4

4 回答 4

2

如果你使用lodash ...

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

更多关于 lodash: http://lodash.com/

于 2013-02-08T00:58:22.093 回答
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);
于 2013-02-08T00:49:35.227 回答
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);
于 2013-02-08T00:37:42.013 回答
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;
  }
});

然后,occurrence 将具有 nums 中每个值的出现次数,数字本身就是键。

于 2013-02-08T00:41:08.310 回答