javascript中用set实现数组并集、差集和对称差集:并集将两数组合并后用set去重;差集遍历arr1保留不在arr2 set中的元素;对称差集为两方向差集合并去重。

JavaScript 中用 Set 实现数组的并集和差集,核心是利用 Set 自动去重、支持迭代、可快速查找的特性,再结合扩展运算符(...)或 Array.from() 转回数组。
并集(Union):合并两个数组,去除重复元素
把两个数组所有元素放进一个 Set,它会自动去重;再转成数组即可。
示例代码:
const arr1 = [1, 2, 3]; const arr2 = [3, 4, 5]; <p>const union = [...new Set([...arr1, ...arr2])]; // 结果:[1, 2, 3, 4, 5] </p>
说明:
-
[...arr1, ...arr2]合并两个数组为新数组(含重复) -
new Set(...)构造 Set,自动过滤重复项 -
[...set]展开为新数组
差集(Difference):获取 arr1 中有、但 arr2 中没有的元素
遍历 arr1,只保留那些在 arr2 的 Set 中不存在的元素。
示例代码:
const arr1 = [1, 2, 3, 4]; const arr2 = [3, 4, 5]; <p>const set2 = new Set(arr2); const difference = arr1.filter(x => !set2.has(x)); // 结果:[1, 2] </p>
说明:
- 先将
arr2转为Set,提升.has()查找效率(O(1)) -
filter遍历arr1,用!set2.has(x)判断是否不在arr2中 - 结果保持
arr1原顺序,且不重复(若arr1本身有重复,需额外去重)
对称差集(Symmetric Difference):只在其中一个数组中出现的元素
即“并集减去交集”,等价于 (arr1 - arr2) ∪ (arr2 - arr1)。
示例代码:
const arr1 = [1, 2, 3]; const arr2 = [3, 4, 5]; <p>const set1 = new Set(arr1); const set2 = new Set(arr2);</p><p>const diff1 = [...arr1].filter(x => !set2.has(x)); const diff2 = [...arr2].filter(x => !set1.has(x));</p><p>const symmetricDiff = [...new Set([...diff1, ...diff2])]; // 结果:[1, 2, 4, 5] </p>
说明:
- 分别求出
arr1对arr2和arr2对arr1的差集 - 合并后用
Set去重(避免两边差集里有相同元素) - 也可封装为复用函数,传入任意两个数组
注意事项与小技巧
实际使用时注意这些细节:
-
Set对象只对基本类型(数字、字符串、布尔值)严格相等判断;对象或数组引用不同即视为不同,无法按内容去重 - 如果数组含
NaN,Set可正确保留一个(因为NaN === NaN为false,但Set内部特殊处理使其唯一) - 想保持原始顺序又去重,不要用
Array.from(new Set(arr))替代[...new Set(arr)],两者效果一致,但前者略显冗余 - 大数组场景下,先构建
Set再filter比嵌套循环快得多(从 O(n×m) 降到 O(n+m))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











