js set 的唯一性是集合运算的底层支撑,使其并集、交集、差集操作高效:并集用 add 自动去重(o(n)),交集用 has 配合 filter(o(n)),差集则取反条件筛选。

JS Set 的唯一性不是装饰,而是集合运算的底层支撑。它让并集、交集、差集这些操作不再依赖嵌套循环或手动比对,直接靠结构特性完成高效计算。
利用 add 的自动去重做并集(union)
Set 的 add() 方法遇到重复值会静默忽略,这天然适合合并多个集合:
- 创建一个空 Set,依次遍历所有待合并数组,把每个元素 add 进去
- 重复值自动跳过,最终结果就是无重复的并集
- 比用
Array.concat().filter((v, i, a) => a.indexOf(v) === i)快得多,时间复杂度从 O(n²) 降到 O(n)
示例:
const a = new Set([1, 2, 3]);const b = new Set([3, 4, 5]);
const union = new Set([...a, ...b]); // {1, 2, 3, 4, 5}
用 has 配合 filter 实现交集(intersection)
交集本质是“在 A 中也存在于 B 中”的元素。Set 的 has() 方法平均查找时间复杂度为 O(1),比数组的 includes() 或 indexOf() 更快:
- 把其中一个集合转为 Set(比如 b),再对另一个集合(比如 a)调用
filter(v => b.has(v)) - 无需双重遍历,单次扫描即可完成
- 注意:若 a 是数组,b 是 Set,推荐用 a.filter;若两者都是 Set,可先转成数组再 filter,或用 for...of 手动收集
示例:
const a = [1, 2, 3, 4];const b = new Set([2, 3, 5]);
const intersection = a.filter(x => b.has(x)); // [2, 3]
基于 has 反向筛选实现差集(difference)
差集 A − B 是指“在 A 中但不在 B 中”的元素。逻辑和交集相反,只需把 filter 条件取反:
- 将 B 转为 Set 提升查询效率
- 对 A 中每个元素 v,保留满足
!b.has(v)的项 - 适用于数组与 Set、Set 与 Set、甚至对象数组(配合 key 提取)
示例:
const a = new Set([1, 2, 3, 4]);const b = new Set([2, 4, 5]);
const diff = [...a].filter(x => !b.has(x)); // [1, 3]
扩展:链式操作与复用技巧
Set 实例方法大多返回 this(如 add、delete),支持链式调用;size 属性可即时获取规模,便于条件控制:
- 构建过程中随时检查
set.size判断是否已达上限 - 用
forEach或for...of遍历时,顺序按插入顺序,稳定可预期 - 避免用
Array.from(set).sort()做排序——Set 本身不排序,排序需显式处理 - NaN 和 -0 在 Set 中能被正确识别为唯一值(与 === 不同),这点比对象键更可靠











