在JavaScript开发中,获取两个数组的差集是常见需求,差集指的是属于第一个数组但不属于第二个数组的元素组成的集合。很多开发者会问js怎么用difference获取数组的差集,下面我们就来详细讲解相关实现方式。

什么是difference
difference直译是差异、不同,在数组操作场景中,difference通常指获取两个数组的差集。需要注意的是,JavaScript原生语法并没有内置的difference函数,我们常说的difference一般是工具库提供的函数,或者是开发者自定义的实现差集功能的函数名称。
原生JavaScript实现数组差集
如果不依赖第三方工具库,我们可以用原生JS的数组方法实现差集功能,核心思路是遍历第一个数组,筛选出不在第二个数组中出现的元素。
基础实现(适用于基本类型数组)
当数组元素是数字、字符串等基本类型时,可以用includes或者indexOf方法判断元素是否存在于第二个数组中。
// 自定义difference函数,获取arr1相对于arr2的差集
function difference(arr1, arr2) {
// 遍历arr1,筛选出不在arr2中的元素
return arr1.filter(item => !arr2.includes(item));
}
// 示例测试
const array1 = [1, 2, 3, 4, 5];
const array2 = [3, 4, 5, 6, 7];
const result = difference(array1, array2);
console.log(result); // 输出 [1, 2]
处理引用类型数组的差集
如果数组元素是对象等引用类型,直接用includes判断会失效,因为引用类型比较的是引用地址,此时需要先对元素做序列化处理,或者根据唯一标识判断。
// 处理对象数组的差集,根据id作为唯一标识
function differenceByObj(arr1, arr2, key) {
// 提取arr2中所有元素的key值,存为集合方便查找
const arr2Keys = new Set(arr2.map(item => item[key]));
// 筛选arr1中key值不在arr2Keys中的元素
return arr1.filter(item => !arr2Keys.has(item[key]));
}
// 示例测试
const objArr1 = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}];
const objArr2 = [{id: 2, name: 'b'}, {id: 3, name: 'c'}, {id: 4, name: 'd'}];
const objResult = differenceByObj(objArr1, objArr2, 'id');
console.log(objResult); // 输出 [{id: 1, name: 'a'}]
使用lodash的difference函数
如果项目中已经引入了lodash工具库,可以直接使用其内置的difference函数,该函数原生支持基本类型数组的差集计算,使用起来更简洁。
// 先引入lodash,这里假设已经通过script标签或者模块化方式引入
// 示例:获取两个数组的差集
const _ = require('lodash');
const arrA = ['a', 'b', 'c', 'd'];
const arrB = ['c', 'd', 'e', 'f'];
const lodashResult = _.difference(arrA, arrB);
console.log(lodashResult); // 输出 ['a', 'b']
lodash还提供了differenceBy和differenceWith等扩展方法,分别支持根据迭代器函数和自定义比较逻辑计算差集,适合更复杂的场景。
注意事项
- 自定义difference函数时,要注意第二个参数如果不是数组,需要先做类型校验,避免出现报错。
- 处理大型数组时,用
Set存储第二个数组的元素可以提升查找效率,减少时间复杂度。 - 如果数组中存在NaN元素,原生
includes可以正确识别NaN,而indexOf无法识别,选择方法时需要注意这个差异。
数组差集的实现方式可以根据实际场景选择,小型项目用原生实现即可,大型项目或复杂场景可以借助成熟的工具库函数,减少重复开发成本。
difference数组差集JavaScript数组操作修改时间:2026-07-23 06:21:18