You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:24:01