es6 的 set 可高效求两数组交集、并集、差集:交集用 filter + has,结果顺序同原数组且去重;并集用扩展运算符合并后转 set;差集用 filter 排除另一数组 set 中存在的元素。

用 ES6 的 Set 求两个数组的交集、并集、差集,核心是先转成 Set 去重,再借助 filter 和 has 方法做逻辑判断,代码简洁、性能好、语义清晰。
交集:取两个数组中都存在的元素
把一个数组转为 Set,再用另一个数组 filter,只保留在该 Set 中存在的项。
示例:
const arr1 = [1, 2, 3, 4]; const arr2 = [2, 3, 4, 5, 6]; const set2 = new Set(arr2); const intersection = arr1.filter(item => set2.has(item)); // → [2, 3, 4]
- 注意:结果顺序与
arr1一致,重复元素自动过滤(因 Set 本身去重) - 若需返回 Set 类型,可写成
[...new Set(intersection)]
并集:合并所有不重复的元素
直接合并两个数组,再用 Set 去重即可。推荐用扩展运算符,简洁直观。
示例:
const arr1 = [1, 2, 3]; const arr2 = [2, 3, 4, 5]; const union = [...new Set([...arr1, ...arr2])]; // → [1, 2, 3, 4, 5]
- 比
concat + reduce更高效,避免多次遍历 - 如果原数组含对象等引用类型,Set 无法去重(因对象内存地址不同),此时需自定义逻辑
差集:A - B,即 A 中有但 B 中没有的元素
对数组 A 进行 filter,条件是“不在 B 的 Set 中”。
示例:
const arr1 = [1, 2, 3, 4]; const arr2 = [2, 4, 6]; const set2 = new Set(arr2); const difference = arr1.filter(item => !set2.has(item)); // → [1, 3]
- B - A 只需调换角色:
arr2.filter(item => !new Set(arr1).has(item)) - 差集结果保持原数组顺序,且天然无重复
补充说明:NaN 和对象的特殊情况
Set 对 NaN 是特殊处理的——多个 NaN 被视为同一值,能正确去重;但对象即使内容相同,也会被当作不同元素。
new Set([NaN, NaN]); // Set { NaN }
new Set([{a:1}, {a:1}]); // Set { {a:1}, {a:1} }(两个不同对象)
- 涉及对象比较时,建议先用 JSON.stringify 或自定义 key 提取唯一标识
- 如需深度比较,不能只靠 Set,得配合 find / some 等方法











