Angular 8中如何比较两个JSON对象的共有键值?
问题描述
我有两个包含键值对的对象obj1和obj2,需要比较二者共有的键对应的值:若共有键的值全部相等则返回false,否则返回true。注意:需忽略仅在其中一个对象中存在的键(例如obj1中存在id键但obj2中不存在,则忽略该键)。
请问有没有代码更简洁的实现方案?
我尝试过的代码如下:
compareResponseAndFormValue(){ const result = JSON.stringify(this.obj1) === JSON.stringify(this.obj2); console.log(result,"result") }
预期输出:
在以下示例中,obj1和obj2的bankHoliday字段值不同,因此应返回true。
示例数据:
const obj1 = { "id": "", "uom": "OOOUnits", "classifiedHours": 720, "entryType": "Monthly", "entryDetails": { "month": "April", "year": 2024 }, "dataSource": "MDCS", "availableTime": { "bankHoliday": "8" }, "valueOperatingTime": { "breakDownTime": null }, "operatingTime": { "maintenanceTime": 0 }, "loadingTime": { "nominalSpeed": "130" }, "oeeCalculations": { "others": { "totalTime": 720 } } } const obj2 = { "lineId": "E_A571_D", "classifiedHours": null, "entryDetails": { "month": "April", "year": 2024 }, "availableTime": { "bankHoliday": "6.05" }, "valueOperatingTime": { "breakDownTime": null }, "operatingTime": { "maintenanceTime": 0 }, "loadingTime": { "nominalSpeed": "130" }, "oeeCalculations": { "others": { "totalTime": 720 } }, "uom": "OOOUnits", }
解决方案
你原来用JSON.stringify的方法存在两个问题:
- 会比较所有键(包括仅存在于其中一个对象的键),不符合“忽略仅一方存在的键”的要求;
- 对象键的顺序不同也会导致结果不等,而实际我们不需要关心键的顺序。
下面是更简洁且符合需求的实现,核心思路是只比较两个对象的共有键,并递归处理嵌套对象/数组的情况:
// 递归比较两个值是否相等(忽略仅一方存在的键) function isDeepEqual(a, b) { // 类型不同直接判定不等 if (typeof a !== typeof b) return false; // 基本类型或null,直接比较值 if (typeof a !== 'object' || a === null) return a === b; // 数组情况:长度不同则不等,否则逐个元素比较 if (Array.isArray(a)) { if (a.length !== b.length) return false; return a.every((item, idx) => isDeepEqual(item, b[idx])); } // 对象情况:只比较共有键对应的值 const commonKeys = Object.keys(a).filter(key => key in b); return commonKeys.every(key => isDeepEqual(a[key], b[key])); } // 主函数:判断共有键是否存在值不等的情况 function compareObjects(obj1, obj2) { const commonKeys = Object.keys(obj1).filter(key => key in obj2); // 只要有一个共有键的值不等,就返回true;全相等则返回false return commonKeys.some(key => !isDeepEqual(obj1[key], obj2[key])); }
使用示例
代入你提供的示例数据:
console.log(compareObjects(obj1, obj2)); // 输出:true
这个实现满足你的需求:
- 自动忽略仅在其中一个对象中存在的键;
- 递归处理嵌套的对象和数组;
- 代码简洁,逻辑清晰。
内容的提问来源于stack exchange,提问作者Shilpa
相关产品推荐
相关产品推荐

