要保留重复次数最多的项,需先用map统计各元素频次,再找出最大频次并筛选对应元素;若频次相同则可全保留或取首个;对象等复杂类型需转为唯一原始键(如id)再统计。

要保留重复次数最多的项(即找出数组中出现频次最高的元素),而不是简单去重,核心是统计每个元素的出现次数,再筛选出频次最大者。若最高频次有多个元素,则可选择全部保留或只取第一个——需根据实际需求决定。
统计每个元素的出现次数
用 Map 或普通对象遍历计数,推荐 Map 以支持任意类型键(如对象、NaN):
const arr = [1, 2, 2, 3, 3, 3, 4];
const countMap = new Map();
for (const item of arr) {
countMap.set(item, (countMap.get(item) || 0) + 1);
}
// Map { 1 => 1, 2 => 2, 3 => 3, 4 => 1 }
找出最高频次及对应的所有元素
遍历 Map 获取最大频次,再二次筛选所有达到该频次的元素:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const maxCount = Math.max(...countMap.values()); const mostFrequent = [...countMap.entries()] .filter(([_, count]) => count === maxCount) .map(([item]) => item); console.log(mostFrequent); // [3]
- 如果数组是
['a', 'b', 'b', 'c', 'c'],结果为['b', 'c'] - 想只保留第一个最高频元素,可用
.find()替代.filter()
一行简洁写法(适用于基础类型)
用 reduce + Object 配合 Math.max 和 filter,适合快速原型:
const arr = [1, 2, 2, 3, 3, 3];
const counts = arr.reduce((acc, v) => ({ ...acc, [v]: (acc[v] || 0) + 1 }), {});
const max = Math.max(...Object.values(counts));
const result = Object.keys(counts).filter(k => counts[k] === max).map(Number);
- 注意:
Object.keys返回字符串键,数字需用map(Number)转回 - 含
undefined、null或对象时,此法不安全,优先用 Map 方案
处理复杂类型(如对象数组)
若数组元素是对象,需定义“相等”逻辑(如按某个 id 字段):
const users = [{id: 1}, {id: 2}, {id: 1}, {id: 1}];
const countMap = new Map();
users.forEach(u => {
const key = u.id; // 自定义唯一标识
countMap.set(key, (countMap.get(key) || 0) + 1);
});
const maxCount = Math.max(...countMap.values());
const topId = [...countMap.entries()].find(([_, c]) => c === maxCount)[0];
const mostFrequentUser = users.find(u => u.id === topId);
- 关键:把对象归约到可比较的原始值(如 id、name、JSON.stringify 等)
- 避免直接用对象作 Map 键——默认引用不同即视为不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










