js怎么用difference获取数组的差集

来源:我的博客作者:狼行天下头衔:草根站长
导读:本期聚焦于小伙伴创作的《js怎么用difference获取数组的差集》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《js怎么用difference获取数组的差集》有用,将其分享出去将是对创作者最好的鼓励。

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

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还提供了differenceBydifferenceWith等扩展方法,分别支持根据迭代器函数和自定义比较逻辑计算差集,适合更复杂的场景。

注意事项

  • 自定义difference函数时,要注意第二个参数如果不是数组,需要先做类型校验,避免出现报错。
  • 处理大型数组时,用Set存储第二个数组的元素可以提升查找效率,减少时间复杂度。
  • 如果数组中存在NaN元素,原生includes可以正确识别NaN,而indexOf无法识别,选择方法时需要注意这个差异。
数组差集的实现方式可以根据实际场景选择,小型项目用原生实现即可,大型项目或复杂场景可以借助成熟的工具库函数,减少重复开发成本。

difference数组差集JavaScript数组操作修改时间:2026-07-23 06:21:18

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。