JavaScript的Set无内置交集并集方法,交集用filter+b.has()实现,如new Set([...a].filter(x => b.has(x)));并集用展开运算符合并后转Set,如new Set([...a, ...b])。

JavaScript 的 Set 本身没有内置的交集(intersection)和并集(union)方法,但可以用数组方法配合展开运算符或迭代器轻松实现。
求两个 Set 的交集
交集是指同时存在于两个集合中的元素。核心思路:遍历其中一个 Set,用另一个 Set 的 has() 方法判断是否也存在。
- 把其中一个 Set 转成数组,用
filter()筛出在另一个 Set 中也存在的元素 - 再用
new Set()包裹结果,得到新的交集 Set
示例:
const a = new Set([1, 2, 3, 4]);
const b = new Set([3, 4, 5, 6]);
const intersection = new Set([...a].filter(x => b.has(x)));
// → Set {3, 4}
求两个 Set 的并集
并集是两个集合所有元素合并后的去重结果。最简洁的方式是用展开运算符合并两个 Set 的值,再传给 new Set()。
立即学习“Java免费学习笔记(深入)”;
-
[...a, ...b]展开两个 Set 的元素为数组(自动去重) -
new Set([...a, ...b])创建新 Set,重复元素会被自动忽略
示例:
const a = new Set([1, 2, 3]);
const b = new Set([3, 4, 5]);
const union = new Set([...a, ...b]);
// → Set {1, 2, 3, 4, 5}
扩展:差集(a - b)与对称差集
虽然不是原问题,但常一起使用:
-
差集(a 减去 b):用
filter(x => !b.has(x)),保留只在 a 中、不在 b 中的元素 -
对称差集:即「在 a 或 b 中,但不同时在两者中」,可表示为
(a − b) ∪ (b − a)
例如差集:
const difference = new Set([...a].filter(x => !b.has(x)));
// a = [1,2,3], b = [3,4,5] → Set {1, 2}
注意点
Set 元素比较基于 SameValueZero(类似 ===),所以对象引用不同即视为不同元素,即使内容一样。
- 若需按对象属性求交,并非直接用 Set,应先提取 key 或序列化再处理
- 性能上,
has()平均时间复杂度是 O(1),所以交集操作整体接近 O(n) - 避免频繁创建中间数组;大数据量时可考虑手动 for...of 循环优化


















