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
相关产品推荐
相关产品推荐

