获取数组中出现次数最多的元素

2022-08-30 05:31:36

我正在寻找一种优雅的方法来确定哪个元素在JavaScript数组中具有最高的出现次数(模式)。

例如,在

['pear', 'apple', 'orange', 'apple']

元素是最常见的元素。'apple'


答案 1

这只是模式。这是一个快速、未优化的解决方案。它应该是 O(n)。

function mode(array)
{
    if(array.length == 0)
        return null;
    var modeMap = {};
    var maxEl = array[0], maxCount = 1;
    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];
        if(modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;  
        if(modeMap[el] > maxCount)
        {
            maxEl = el;
            maxCount = modeMap[el];
        }
    }
    return maxEl;
}

答案 2

自2009年以来,javascript已经有了一些发展 - 我想我会添加另一个选项。我不太关心效率,直到它实际上是一个问题,所以我对“优雅”代码的定义(如OP规定)有利于可读性 - 这当然是主观的......

function mode(arr){
    return arr.sort((a,b) =>
          arr.filter(v => v===a).length
        - arr.filter(v => v===b).length
    ).pop();
}

mode(['pear', 'apple', 'orange', 'apple']); // apple

在此特定示例中,如果集合的两个或多个元素具有相等的出现次数,则将返回数组中出现最新的元素。还值得指出的是,它将修改您的原始数组 - 如果您愿意事先使用Array.slice调用,则可以阻止这种情况。


编辑:用一些ES6胖箭头更新了示例,因为2015年发生了,我认为它们看起来很漂亮......如果您担心向后兼容性,可以在修订历史记录中找到它。