JavaScript中用Set实现数组交集和并集更简洁高效:交集先将一数组转Set再filter筛选共有的元素,结果去重且按第二数组顺序;并集直接合并两数组后转Set去重。

JavaScript 中用 Set 实现数组交集和并集,核心是利用其去重和快速查找特性,比传统嵌套循环更简洁高效。
用 Set 求两个数组的交集
交集指同时存在于两个数组中的元素。先把一个数组转为 Set,再用 filter 配合 has() 判断另一个数组中哪些元素在该 Set 中存在。
注意:结果默认不保留重复项(Set 本身去重),且顺序按第二个数组的原始顺序排列。
- 把
arr2转成 Set,便于 O(1) 查找 - 遍历
arr1,用set2.has(item)筛出共有的元素 - 最后用
[...new Set(...)]或直接返回数组(若允许重复可跳过去重)
示例:
立即学习“Java免费学习笔记(深入)”;
const arr1 = [1, 2, 3, 4]; const arr2 = [3, 4, 5, 6]; const intersection = [...new Set(arr1.filter(item => new Set(arr2).has(item)))]; // → [3, 4]
用 Set 求两个数组的并集
并集是两个数组所有不重复元素的合集。最直接的方式是把两个数组合并后转为 Set,再展开。
- 用扩展运算符
[...arr1, ...arr2]合并数组 - 传入
Set构造函数自动去重 - 再用扩展运算符转回数组即可
示例:
立即学习“Java免费学习笔记(深入)”;
const arr1 = [1, 2, 3]; const arr2 = [3, 4, 5]; const union = [...new Set([...arr1, ...arr2])]; // → [1, 2, 3, 4, 5]
优化写法:避免重复创建 Set
上面交集示例中每次 filter 都新建 Set,影响性能。推荐先建好 Set 再复用。
- 提前创建
set2 = new Set(arr2) - 在
filter中直接调用set2.has() - 交集结果也可用
Array.from(set1).filter(...),视数据量和需求选择
优化后交集写法:
const set2 = new Set(arr2); const intersection = [...new Set(arr1.filter(item => set2.has(item)))];
注意事项与边界情况
Set 只能存储唯一值,且判断相等基于 Same-value-zero 算法(NaN === NaN 为 true)。但对象引用不同即视为不同元素。
- 对基本类型(数字、字符串)完全适用
- 对对象数组需先提取标识字段(如
id),否则无法正确交并集 - 若需保留原数组重复项或特定顺序,Set 方案需额外处理
- 空数组或一方为空时,交集为空,
union等于非空方(去重后)
不复杂但容易忽略细节。


















