javascript去重并统计频次需先计数再过滤,推荐用object(适合基本类型)或map(支持任意类型键),最后可转为{value,count}数组结构,单纯set或filter无法保留数量信息。

在 JavaScript 中去重并统计每个元素出现次数,核心思路是先计数再过滤,而不是单纯用 Set 或 filter 去重——因为去重本身会丢掉重复信息。推荐用对象或 Map 统计频次,再根据需求提取唯一值及其数量。
用 Object 统计 + 获取去重后的数量
适用于字符串、数字等基本类型。遍历数组,用元素作为 key 累加次数:
const arr = ['a', 'b', 'a', 'c', 'b', 'a'];
const count = {};
arr.forEach(item => {
count[item] = (count[item] || 0) + 1;
});
// count 就是去重后的统计结果:{ a: 3, b: 2, c: 1 }
console.log(count);
用 Map 更安全地处理任意类型(含对象、NaN)
Object 的 key 会强制转为字符串,导致 {}、NaN、[1] 等容易冲突;Map 支持任意类型作为键:
const arr = [1, '1', NaN, NaN, {}, {}];
const countMap = new Map();
arr.forEach(item => {
const existing = countMap.get(item) || 0;
countMap.set(item, existing + 1);
});
// 遍历结果
for (const [key, times] of countMap) {
console.log(key, '出现了', times, '次');
}
一步得到「唯一元素 + 出现次数」的数组结构
如果最终要的是类似 [{ value: 'a', count: 3 }, ...] 的数组,可用 Array.from + Map:
const arr = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
const countMap = arr.reduce((map, item) => {
map.set(item, (map.get(item) || 0) + 1);
return map;
}, new Map());
const result = Array.from(countMap, ([value, count]) => ({ value, count }));
// [{ value: 'apple', count: 3 }, { value: 'banana', count: 2 }, { value: 'orange', count: 1 }]
注意:不要混淆「去重」和「计数」的目的
单纯用 [...new Set(arr)] 只能得到无序唯一值,完全丢失数量信息;而 filter((v, i) => arr.indexOf(v) === i) 同样不提供频次。必须引入中间状态(如对象或 Map)来累积计数。











