找出数组中出现次数最多的元素,核心是统计频次后取最大值;推荐用Map方案,兼容所有类型且健壮易读;若需返回所有并列最多元素,则先求最高频次再筛选。

要找出数组中出现次数最多的元素,核心思路是统计每个元素的出现频次,再找出频次最高的那个。JavaScript 有多种简洁有效的方式实现,下面介绍几种常用且实用的方法。
用 Map 统计频次 + 遍历找最大
这是最清晰、兼容性好、适合各种类型元素(包括对象、数组等)的方式:
- 创建一个 Map,遍历数组,对每个元素做计数(存在则 +1,否则设为 1)
- 再遍历 Map,记录当前最大频次及对应元素
- 注意:若多个元素并列最多,此方法默认返回第一个遇到的
function findMostFrequent(arr) {
if (arr.length === 0) return undefined;
const count = new Map();
for (const item of arr) {
count.set(item, (count.get(item) || 0) + 1);
}
let maxCount = -1;
let result;
for (const [item, freq] of count) {
if (freq > maxCount) {
maxCount = freq;
result = item;
}
}
return result;
}
findMostFrequent([1, 2, 2, 3, 3, 3]); // → 3
用 reduce + Object 配合(适合基础类型)
如果数组只含字符串、数字、布尔值等可安全作为对象键的值,可以用普通对象统计:
- 用 reduce 构建频次对象
- 再用 Object.entries 找出频次最高的键
- 比 Map 略快,但不支持以对象/数组为元素的场景(会转成 "[object Object]")
function findMostFrequent(arr) {
if (!arr.length) return undefined;
const counts = arr.reduce((acc, item) => {
acc[item] = (acc[item] || 0) + 1;
return acc;
}, {});
return Object.entries(counts).reduce((a, b) =>
a[1] > b[1] ? a : b
)[0];
}
一行式(ES6+,适合简单场景)
追求简洁、数组不大、且元素类型安全时,可用链式写法:
立即学习“Java免费学习笔记(深入)”;
- 先用 Set 去重得到所有唯一值
- 对每个唯一值用 filter 计数
- 再用 reduce 比较频次
const findMostFrequent = arr =>
arr.length
? [...new Set(arr)].reduce((a, b) =>
arr.filter(v => v === a).length >= arr.filter(v => v === b).length
? a
: b
)
: undefined;
⚠️ 注意:该写法时间复杂度为 O(n²),仅适合小数组;重复 filter 效率低,不推荐用于大数据量。
处理并列最多的情况
如果需要返回所有出现次数最多的元素(不止一个),只需稍作调整:
- 先算出最高频次 maxFreq
- 再遍历 Map 或对象,收集所有频次等于 maxFreq 的元素
function findAllMostFrequent(arr) {
if (!arr.length) return [];
const count = new Map();
arr.forEach(item => count.set(item, (count.get(item) || 0) + 1));
const maxFreq = Math.max(...count.values());
return [...count.keys()].filter(key => count.get(key) === maxFreq);
}
findAllMostFrequent([1, 1, 2, 2, 3]); // → [1, 2]
不复杂但容易忽略细节:空数组、全等元素、引用类型比较。推荐优先使用 Map 方案,健壮又易读。


















