如何获取JavaScript数组中出现频次最高的前五个元素
解决方案
你可以按照「统计频次→按频次排序→取前N位」的逻辑实现,比你当前用filter嵌套在sort里的写法效率高很多,数组规模越大优势越明显。
完整可运行代码
const arr = [ "fuji", "acros", "bombshell", "4za", "aerozine", "bianchi-milano", "bianchi-milano", "aerozine", "rapha", "rapha", "rapha", "100%", "100%", "100%", "100%" ]; // 1. 统计每个元素的出现次数 const frequency = {}; for (const item of arr) { frequency[item] = (frequency[item] || 0) + 1; } // 2. 对去重后的元素按频次降序排序 const sortedItems = [...new Set(arr)].sort((a, b) => frequency[b] - frequency[a]); // 3. 截取前5位即可 const top5 = sortedItems.slice(0, 5); console.log(top5); // 输出和你预期的结果一致
逻辑说明
- 统计频次:仅需要遍历原始数组1次,用对象键存储元素值、值存储对应出现次数,时间复杂度为O(n)。你原有的写法中sort每次比较都要遍历两次数组做filter,整体时间复杂度为O(n²logn),数组元素过万的话会有明显的性能问题。
- 去重排序:用Set对原始数组去重后再排序,避免同一个元素重复参与排序逻辑;排序直接取两个元素的频次做降序对比即可,频次相同的元素排序顺序不做限制,符合你提到的「同频次元素可随机取」的要求。
- 截取结果:用
slice(0,5)取前5位,就算去重后的元素总数不足5个也不会报错,会自动返回所有元素。
精简链式写法
如果偏好短代码,也可以用Map实现链式写法,逻辑和上面完全一致:
const top5 = [...arr.reduce((map, item) => map.set(item, (map.get(item) || 0) + 1), new Map())] .sort((a, b) => b[1] - a[1]) .map(item => item[0]) .slice(0, 5);
内容的提问来源于stack exchange,提问作者Aleksa Prebiracevic
相关产品推荐
相关产品推荐

