JavaScript中交集、并集、差集可通过Set去重结合filter、concat和扩展运算符高效实现:交集用setB.has(x)筛选共有的去重元素;并集用[...new Set([...a,...b])]合并去重;差集用filter配合!setB.has(x)获取a中有而b中无的元素。

JavaScript 中利用原生数组方法实现交集、并集、差集,关键在于结合 Set 去重 + 数组的 filter、concat 和扩展运算符,既简洁又高效(时间复杂度接近 O(n+m)),避免嵌套循环。
求交集(两个数组共有的元素)
用 Set 快速判断存在性,再用 filter 筛选:
const intersection = (a, b) => {
const setB = new Set(b);
return [...new Set(a)].filter(x => setB.has(x));
};
- 先对
a转为Set去重,再转回数组,避免重复结果 -
setB.has(x)是 O(1) 查找,比includes更快(尤其对大数组) - 示例:
intersection([1,2,2,3], [2,3,4]) → [2,3]
求并集(两个数组所有不重复元素)
直接合并后转 Set 去重,再转回数组:
const union = (a, b) => [...new Set([...a, ...b])];
-
[...a, ...b]合并数组,new Set自动去重 - 保持原始顺序(先 a 后 b,重复元素以首次出现为准)
- 示例:
union([1,2], [2,3]) → [1,2,3]
求差集(a 中有、b 中没有的元素)
对 a 去重后,过滤掉在 b 中存在的项:
立即学习“Java免费学习笔记(深入)”;
const difference = (a, b) => {
const setB = new Set(b);
return [...new Set(a)].filter(x => !setB.has(x));
};
- 注意:这是「a 对 b 的差集」,即
a \ b;若需对称差集(只在其中一个数组里),可用union(a,b).filter(x => !intersection(a,b).includes(x)) - 同样利用
Set提升查找效率 - 示例:
difference([1,2,3], [2,3,4]) → [1]
进阶提示:处理对象数组或自定义比较
上述方法默认按值严格相等(===)比较,对对象无效。如需按某个属性求交集:
const intersectionBy = (a, b, key) => {
const setB = new Set(b.map(item => item[key]));
return [...new Set(a.map(item => item[key]))]
.filter(val => setB.has(val))
.map(val => ({ [key]: val }));
};
- 先提取关键字段生成
Set,再反向构造结果(可根据需求调整) - 更灵活的做法是配合
find或some,但性能略低;大数据量仍推荐预建索引(如 Map)
不复杂但容易忽略:始终优先用 Set 加速查找,避免在 filter 内反复调用 includes —— 那会让时间复杂度退化到 O(n×m)。


















