javascript去重并统计频次应一次遍历用对象或map计数:object适合基本类型但会强制转字符串键,map支持任意类型键且更健壮;可转数组按频次排序。

在 JavaScript 中,去重并统计每个元素出现次数,本质是“分组计数”,不需要先去重再统计——因为去重会丢失重复信息。正确做法是一次遍历,用对象或 Map 记录每个值的累计频次。
用 Object(适合字符串、数字等基本类型)
利用对象属性名唯一性,把元素转为字符串作 key,值为出现次数:
const arr = ['a', 'b', 'a', 'c', 'b', 'a'];
const count = {};
<p>arr.forEach(item => {
count[item] = (count[item] || 0) + 1;
});</p><p>console.log(count); // { a: 3, b: 2, c: 1 }
console.log(Object.keys(count)); // ['a', 'b', 'c'] —— 自动去重后的键数组
</p>⚠️ 注意:Object 的 key 会强制转为字符串,{}、null、NaN 等会变成 "[object Object]"、"null"、"NaN",导致误合并。如需精确区分引用类型,改用 Map。
用 Map(支持任意类型键,更健壮)
Map 保留原始键类型,适合含对象、函数、Symbol 或需要严格区分 0 和 false 的场景:
const arr = [1, '1', true, 0, false, {}, {}];
const count = new Map();
<p>arr.forEach(item => {
count.set(item, (count.get(item) || 0) + 1);
});</p><p>// 获取去重后的所有唯一元素(即 Map 的 key)
const uniqueItems = Array.from(count.keys());
// 获取频次对象(可选)
const result = Object.fromEntries(count);</p><p>console.log(uniqueItems); // [1, "1", true, 0, false, {}, {}]
console.log(result); // { '1': 1, 'true': 1, '0': 1, 'false': 1, '[object Object]': 2 }
</p>一行式写法(简洁但可读性略低)
结合 reduce 和空对象/Map 初始化:
// Object 版
const countObj = arr.reduce((acc, item) => ({ ...acc, [item]: (acc[item] || 0) + 1 }), {});
<p>// Map 版(推荐用于复杂数据)
const countMap = arr.reduce((map, item) => map.set(item, (map.get(item) || 0) + 1), new Map());
</p>注意:Object 版的展开运算符每次新建对象,大数据量时性能较差;Map 版更高效,且无隐式类型转换风险。
进阶:返回数组格式结果([{ value, count }], 按频次排序)
常用于渲染排行榜或筛选高频项:
const resultArray = Array.from(count.entries()).map(([value, count]) => ({ value, count }))
.sort((a, b) => b.count - a.count); // 降序
<p>console.log(resultArray);
// [{ value: 'a', count: 3 }, { value: 'b', count: 2 }, { value: 'c', count: 1 }]
</p>如果只要前 N 个高频项,加 .slice(0, N) 即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











