使用 Set 配合 filter 可高效提取数组差集:将 arr2 转为 Set 后,filter 遍历 arr1 保留不在 Set 中的元素,如 arr1=[1,2,3,4,5]、arr2=[3,4,6,7] 得差集 [1,2,5];Set 自动去重,基本类型按值比较,引用类型需序列化或手动匹配;可封装为通用函数 difference(a,b),并扩展支持对称差集。

用 Set 配合 filter 提取两个数组的差集,核心思路是:把其中一个数组转为 Set 以实现 O(1) 查找,再用 filter 筛出另一个数组中“不在该 Set 里”的元素。
提取 arr1 中有、arr2 中没有的元素(arr1 - arr2)
这是最常见的差集需求。把 arr2 转成 Set,然后遍历 arr1,保留那些 !set2.has(item) 的项:
const arr1 = [1, 2, 3, 4, 5]; const arr2 = [3, 4, 6, 7]; <p>const set2 = new Set(arr2); const diff = arr1.filter(item => !set2.has(item));</p><p>console.log(diff); // [1, 2, 5] </p>
自动去重 + 支持任意类型(含对象引用)的注意事项
Set 天然去重,但要注意:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 基本类型(数字、字符串、布尔值)按值比较,没问题;
- 对象、数组等引用类型,
Set判断的是引用是否相同,不是内容是否相等; - 如果要按内容比对象,得先序列化(如
JSON.stringify),或手动实现匹配逻辑。
封装成可复用的函数
写成通用函数更清晰,支持传入任意两个数组,并明确差集方向:
const difference = (a, b) => {
const setB = new Set(b);
return a.filter(item => !setB.has(item));
};
<p>// 使用示例
difference([1, 2, 2, 3], [2, 4]); // [1, 3]
difference(['a', 'b', 'c'], ['b']); // ['a', 'c']
</p>想同时获取对称差集(只在其中一个数组里的元素)?
对称差集 = (a - b).concat(b - a),可以分两步计算后合并去重:
const symmetricDifference = (a, b) => {
const setA = new Set(a);
const setB = new Set(b);
return [
...a.filter(x => !setB.has(x)),
...b.filter(x => !setA.has(x))
];
};
<p>symmetricDifference([1, 2, 3], [3, 4, 5]); // [1, 2, 4, 5]
</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










