获取数组中出现次数最多的元素我正在寻找一种优雅的方法来确定哪个元素在JavaScript数组中出现次数最多(模式)。例如,在['pear', 'apple', 'orange', 'apple']'apple'元素是最常见的元素。
3 回答

呼如林
TA贡献1798条经验 获得超3个赞
这只是模式。这是一个快速,非优化的解决方案。它应该是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;}

一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
自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年发生了,我认为它们看起来很漂亮......如果您关注向后兼容性,可以在修订历史中找到它。

长风秋雁
TA贡献1757条经验 获得超7个赞
根据George Jempty's
请求将算法考虑为关系,我提出了Matthew Flaschen's
算法的修改版本。
function modeString(array){ if (array.length == 0) return null; var modeMap = {}, 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]; } else if (modeMap[el] == maxCount) { maxEl += '&' + el; maxCount = modeMap[el]; } } return maxEl;}
现在,这将返回一个字符串,其中模式元素由'&'
符号分隔。收到结果后,可以在该'&'
元素上拆分,然后就可以使用您的模式。
另一个选择是返回一个模块元素数组,如下所示:
function modeArray(array){ if (array.length == 0) return null; var modeMap = {}, maxCount = 1, modes = []; 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) { modes = [el]; maxCount = modeMap[el]; } else if (modeMap[el] == maxCount) { modes.push(el); maxCount = modeMap[el]; } } return modes;}
在上面的例子中,您将能够将函数的结果作为模式数组来处理。
添加回答
举报
0/150
提交
取消