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

JavaScript中嵌套对象比较:递归返回键相等性标识对象

递归比较嵌套对象并生成相等性标识对象

要实现你需要的功能,我们可以写一个递归函数,遍历两个对象的所有键(包括各自独有的属性),对每个键对应的值进行比较:如果是嵌套对象就递归处理,否则直接判断值是否相等。下面是具体的实现方案:

实现思路

  • 先收集两个对象的所有唯一键,确保不会漏掉任何一方新增的属性
  • 对每个键分别处理:
    • 如果两个对象中该键的值都是非null的对象,就递归调用比较函数
    • 否则直接用===判断两个值是否相等(类型和值都一致才返回true)
  • 对于只有一方存在的键,直接返回false

代码实现

function deepCompareEquality(obj1, obj2) {
  // 获取两个对象的所有键,去重得到唯一键集合
  const allKeys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);
  const result = {};

  for (const key of allKeys) {
    const val1 = obj1[key];
    const val2 = obj2[key];

    // 判断是否都是非null的对象
    const isObj1 = typeof val1 === 'object' && val1 !== null;
    const isObj2 = typeof val2 === 'object' && val2 !== null;

    if (isObj1 && isObj2) {
      // 递归处理嵌套对象
      result[key] = deepCompareEquality(val1, val2);
    } else {
      // 直接比较值,不存在的键会被视为undefined,和存在的值比较必然不等
      result[key] = val1 === val2;
    }
  }

  return result;
}

测试示例

用你给出的例子来验证:

const obj1 = { 
  prop1: 1, 
  prop2: "foo", 
  prop3: { prop4: 2, prop5: "bar" } 
};

const obj2 = { 
  prop1: 3, 
  prop2: "foo", 
  prop3: { prop4: 2, prop5: "foobar" }, 
  prop6: "new" 
};

const equality = deepCompareEquality(obj1, obj2);
console.log(equality);

输出结果完全符合你的预期:

{
  prop1: false,
  prop2: true,
  prop3: { prop4: true, prop5: false },
  prop6: false
}

补充说明

  • 这个函数默认只处理普通对象,如果需要支持数组的比较,可以在判断对象类型时加入Array.isArray()的判断,调整递归逻辑即可
  • 使用===进行值比较,确保类型和值都一致才返回true,比如1和"1"会被判定为不相等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:01:03