在JavaScript中从数组中提取最重复的值?

时间:2011-08-26 16:06:50

标签: javascript algorithm

我的问题实际上类似于:Extracting the most duplicate value from an array in JavaScript (with jQuery)

解决方案(我认为是最好的,稍微改变一下):

var arr     = [3, 7, 7, 7, 7, 10, 10, 8, 5, 5, 5, 5, 20, 20, 1],
result  = {}, 
max     = 0, 
res;

for( var i = 0, total = arr.length; i < total; ++i ) {
var val = arr[i],
    inc = ( result[val] || 0 ) + 1;

result[val] = inc;

if( inc > max ) { 
    max = inc;
    res = val;
}
}
alert(res);

我想添加一个额外的内容:如果我们有两个具有相同出现次数的数字,我们怎样才能找到它们的最小值(上面应该警告5而不是7,情况就是这样) ?当前的解决方案仅用于获取第一个最重复的重复,但它不处理重复。 谢谢!

3 个答案:

答案 0 :(得分:2)

在计算发生率之前对数组进行排序:

var arr = [3, 7, 7, 7, 7, 10, 10, 8, 5, 5, 5, 5, 20, 20, 1];

function min_most_duplicate (arr) {
    var result = {},
        max = 0,
        res;

    arr = arr.slice(0); // make a copy of the array
    arr.sort(function(a, b) { return (a - b); }); // sort it numerically

    for( var i = 0, total = arr.length; i < total; ++i ) {
        var val = arr[i],
        inc = ( result[val] || 0 ) + 1;

        result[val] = inc;

        if( inc > max ) { 
            max = inc;
            res = val;
        }
    }

    return res;
}

min_most_duplicate(arr); // returns 5

这是有效的,因为写入for循环的方式将返回它找到的第一个具有最多重复的循环,因此如果数组已排序,则最小的数字将首先出现,因此它将是一个for循环找到。

答案 1 :(得分:1)

这可行,example

var arr = [3, 7, 7, 7, 7, 10, 10, 8, 5, 5, 5, 5, 20, 20, 1],
    result = {},
    max = 0,
    res, key, min;

for (var i = 0, total = arr.length; i < total; ++i) {
    var val = arr[i],
        inc = (result[val] || 0) + 1;

    result[val] = inc;

    if (inc > max) {
        max = inc;
        res = val;
    }
}
for (var i in result) {
    if (result[i] === max) {
        key = parseInt(i, 10);
        min = min || key;
        console.log(min)
        if (min > key) {
            min = key;

        }
    }
}
res = min;
alert(res);

答案 2 :(得分:0)

len