JavaScript的Set无内置交集、差集方法,需用扩展运算符转数组后结合filter()与has()实现:交集为filter(x=>setB.has(x)),差集为filter(x=>!setB.has(x)),并封装为纯函数,注意对象元素需引用相同才匹配。

JavaScript 的 Set 本身没有内置的交集、差集方法,但可以用数组操作或迭代轻松实现。核心思路是:把一个 Set 转成数组,再用 filter() 配合另一个 Set 的 has() 方法筛选元素。
求两个 Set 的交集(共同元素)
交集指同时存在于两个 Set 中的元素。只需遍历其中一个 Set,检查每个值是否也在另一个 Set 中存在。
示例代码:
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);
const intersection = new Set([...setA].filter(x => setB.has(x)));
// → Set { 3, 4 }
- 用
[...setA]展开为数组,便于使用filter -
setB.has(x)是 O(1) 查找,效率高 - 结果包装成新
Set,自动去重且保持集合语义
求 A 相对于 B 的差集(A 有、B 没有)
差集(也叫相对补集)指属于 A 但不属于 B 的元素。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
示例代码:
const difference = new Set([...setA].filter(x => !setB.has(x)));
// → Set { 1, 2 }
- 逻辑与交集类似,只是把
setB.has(x)变成!setB.has(x) - 注意:这是 A − B,不是对称差(即不等于 B − A)
- 如需对称差(只在其中一个里出现的元素),可用
[...setA].filter(x => !setB.has(x)).concat([...setB].filter(x => !setA.has(x)))再转 Set
封装成可复用的工具函数
把常用操作抽成函数,提高可读性和复用性:
const intersection = (a, b) => new Set([...a].filter(x => b.has(x)));
const difference = (a, b) => new Set([...a].filter(x => !b.has(x)));
// 使用
const set1 = new Set(['a', 'b', 'c']);
const set2 = new Set(['b', 'c', 'd']);
console.log(intersection(set1, set2)); // Set {'b', 'c'}
console.log(difference(set1, set2)); // Set {'a'}
- 函数参数统一为 Set 实例,避免类型误用
- 返回仍是 Set,符合预期,无需额外转换
- 不修改原 Set,保证函数纯度
注意事项和常见误区
Set 元素比较基于 SameValueZero 算法(类似 ===),所以对象引用不同就视为不同元素:
const obj1 = { id: 1 };
const obj2 = { id: 1 };
const setX = new Set([obj1]);
const setY = new Set([obj2]);
console.log(intersection(setX, setY).size); // 0 —— 即使内容相同,引用不同就不相等
- 若需按值比较对象,得先序列化(如 JSON.stringify)或自定义匹配逻辑
- 空 Set 或超大 Set 下性能仍良好,因为
has()是常数时间 - 避免直接用
Array.from(set).filter(...)——展开语法[...set]更简洁直观

















