获取数组中出现次数最多的元素
2022-08-30 05:31:36
我正在寻找一种优雅的方法来确定哪个元素在JavaScript数组中具有最高的出现次数(模式)。
例如,在
['pear', 'apple', 'orange', 'apple']
元素是最常见的元素。'apple'
我正在寻找一种优雅的方法来确定哪个元素在JavaScript数组中具有最高的出现次数(模式)。
例如,在
['pear', 'apple', 'orange', 'apple']
元素是最常见的元素。'apple'
这只是模式。这是一个快速、未优化的解决方案。它应该是 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;
}
自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年发生了,我认为它们看起来很漂亮......如果您担心向后兼容性,可以在修订历史记录中找到它。