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

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的方法存在两个问题:

  1. 会比较所有键(包括仅存在于其中一个对象的键),不符合“忽略仅一方存在的键”的要求;
  2. 对象键的顺序不同也会导致结果不等,而实际我们不需要关心键的顺序。

下面是更简洁且符合需求的实现,核心思路是只比较两个对象的共有键,并递归处理嵌套对象/数组的情况:

// 递归比较两个值是否相等(忽略仅一方存在的键)
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:25:13