Set不能统计次数,仅用于去重;统计频次需用Map或对象:遍历数组,以元素为key、累加次数为value存入Map,最终Map的键值对即去重后元素及对应频次。

Set 本身不能直接统计次数,它只负责去重;要统计每个元素出现次数,需配合其他结构(如 Map 或普通对象)使用。核心思路是:先遍历原数组,用 Set 记录已见元素,同时用 Map 累计频次。
用 Map + Set 协同统计(推荐)
虽然 Set 不存重复项,但可以利用它快速判断是否首次遇到某元素,再用 Map 做计数。不过更常见、更简洁的做法是跳过 Set,直接用 Map 遍历累加——因为 Map 的 key 天然唯一,本身就具备“去重”能力。
- 遍历数组,对每个元素:
– 若 Map 中无该 key,设值为 1;
– 若已有,值加 1 - 最终 Map 的键就是去重后的元素,值就是对应出现次数
示例代码:
const arr = ['a', 'b', 'a', 'c', 'b', 'a'];
const countMap = new Map();
for (const item of arr) {
countMap.set(item, (countMap.get(item) || 0) + 1);
}
// 输出:Map(3) { 'a' => 3, 'b' => 2, 'c' => 1 }
console.log(countMap);
// 转为数组方便处理
const result = Array.from(countMap, ([key, count]) => ({ key, count }));
// [{ key: 'a', count: 3 }, { key: 'b', count: 2 }, { key: 'c', count: 1 }]
如果非要显式用 Set 做“去重控制”
适合需要区分“首次出现”和“后续出现”的场景,比如只对第二次及以后的重复项做特殊处理。此时可用 Set 记录已见项,再用对象或 Map 统计:
立即学习“Java免费学习笔记(深入)”;
- 初始化空 Set 和空对象(或 Map)
- 遍历时,用 Set.has() 判断是否首次出现
- 无论是否首次,都更新计数器
示例:
const arr = [1, 2, 1, 3, 2, 1];
const seen = new Set();
const counts = {};
for (const x of arr) {
if (!seen.has(x)) {
seen.add(x);
console.log(`首次见到 ${x}`);
}
counts[x] = (counts[x] || 0) + 1;
}
// counts → { '1': 3, '2': 2, '3': 1 }
一行式方案(用 reduce + Map)
函数式写法,简洁且不依赖外部变量:
const arr = ['x', 'y', 'x']; const counts = arr.reduce( (map, item) => map.set(item, (map.get(item) || 0) + 1), new Map() );
注意:Set 不能替代计数逻辑
下面这种写法是错的:
const set = new Set(arr); // → 只剩唯一值,原始频次全丢失
Set 的设计目标就是“唯一性集合”,没有计数接口。想保留频次,必须额外维护映射关系。


















