You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何获取两个对象数组的差异

我太懂这种查了一堆资料却找不到靠谱解决方案的挫败感了!既然你的对象数组里每个条目都有唯一的id字段,那我们完全可以围绕这个标识来实现两个数组的差异对比,下面给你几种实用的JavaScript实现方法:

方法1:基础实现(filter + some,直观易懂)

这是最容易理解的写法,核心思路是遍历其中一个数组,筛选出另一个数组中没有相同id的项。

// 你的第一个数组
const arr1 = [
  { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },
  { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },
  { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 },
  { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 },
  { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },
  { id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 }
];

// 假设这是你要对比的第二个数组
const arr2 = [
  { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },
  { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 },
  { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 }
];

// 获取仅在arr1中存在的项
const onlyInArr1 = arr1.filter(item1 => !arr2.some(item2 => item2.id === item1.id));

// 获取仅在arr2中存在的项
const onlyInArr2 = arr2.filter(item2 => !arr1.some(item1 => item1.id === item2.id));

// 合并得到所有差异项
const fullDifference = [...onlyInArr1, ...onlyInArr2];

console.log('仅在arr1中的套餐:', onlyInArr1);
console.log('仅在arr2中的套餐:', onlyInArr2);
console.log('两个数组的所有差异项:', fullDifference);

优缺点:写法简单直接,适合小体量数组;但如果数组数据量很大(比如上千条),性能会下降,因为some每次都要遍历整个数组,时间复杂度是O(n*m)。

方法2:性能优化版(Map + Set,适合大数据)

如果你的数组数据量较大,用Map或Set做快速查找能大幅提升性能,把时间复杂度降到O(n+m)。

// 将arr1转成以id为key的Map,方便快速查找
const arr1IdMap = new Map(arr1.map(item => [item.id, item]));

// 获取arr2独有的项:检查Map中是否存在对应id
const onlyInArr2 = arr2.filter(item => !arr1IdMap.has(item.id));

// 将arr2的id存入Set,快速判断arr1的项是否存在
const arr2IdSet = new Set(arr2.map(item => item.id));
const onlyInArr1 = arr1.filter(item => !arr2IdSet.has(item.id));

const fullDifference = [...onlyInArr1, ...onlyInArr2];

console.log('优化后的差异结果:', fullDifference);

核心优势:利用Map和Set的O(1)查找特性,避免了嵌套遍历,数据量越大,性能提升越明显。

方法3:全字段对比(如果需要严格匹配整个对象)

如果你的场景中id可能重复,或者需要判断两个对象的所有字段是否完全一致,可以写一个简单的对比函数(如果有嵌套结构,需要改成深度递归版本):

// 简单的对象全字段对比函数
function isObjectEqual(obj1, obj2) {
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);
  
  // 键的数量不同,直接返回不等
  if (keys1.length !== keys2.length) return false;
  
  // 遍历每个键,对比值
  for (const key of keys1) {
    if (obj1[key] !== obj2[key]) return false;
  }
  return true;
}

// 筛选arr1中在arr2没有完全匹配的项
const onlyInArr1 = arr1.filter(item1 => !arr2.some(item2 => isObjectEqual(item1, item2)));

注意:如果对象里包含嵌套对象、函数或undefined,需要调整对比函数来处理这些特殊情况。

内容的提问来源于stack exchange,提问作者Vikas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:30:21