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

递归比较两个Object,输出缺失键与值变更结果

递归比较两个JavaScript对象,提取缺失键与值差异

需求说明:
递归对比两个JavaScript对象obj1和obj2,生成两个输出结果:

  • output1:包含obj1中存在但obj2缺失的所有键值对(支持嵌套对象)
  • output2:包含两者键名相同但值不同的键值对,保留obj1中的对应值(支持嵌套对象)

示例对象

const obj1 = {
  "val1": "test",
  "stream": {
    "key": true,
    "value": false
  },
  "val2": "test",
  "val3": "test"
}

const obj2 = {
  "val1": "test",
  "stream": {
    "key": false,
    "value": false
  }
}

期望输出

const output1 = {
  "val2": "test",
  "val3": "test"
}

const output2 = {
  "stream": {
    "key": true
  }
}

实现代码

function compareObjects(obj1, obj2) {
  const output1 = {};
  const output2 = {};

  // 遍历obj1的所有自身属性
  for (const key in obj1) {
    if (obj1.hasOwnProperty(key)) {
      const val1 = obj1[key];
      const val2 = obj2[key];

      // obj2无此键,归入output1
      if (!(key in obj2)) {
        output1[key] = val1;
      } else {
        // 判断是否为非null对象,递归处理嵌套结构
        const isObj1 = typeof val1 === 'object' && val1 !== null;
        const isObj2 = typeof val2 === 'object' && val2 !== null;

        if (isObj1 && isObj2) {
          const nestedResult = compareObjects(val1, val2);
          // 递归结果有内容才添加,避免空对象
          if (Object.keys(nestedResult.output1).length) {
            output1[key] = nestedResult.output1;
          }
          if (Object.keys(nestedResult.output2).length) {
            output2[key] = nestedResult.output2;
          }
        } else {
          // 非对象类型直接比较值
          if (val1 !== val2) {
            output2[key] = val1;
          }
        }
      }
    }
  }

  return { output1, output2 };
}

// 使用示例
const { output1, output2 } = compareObjects(obj1, obj2);
console.log('output1:', output1);
console.log('output2:', output2);

代码说明

  1. 属性遍历:用for...in配合hasOwnProperty确保只处理对象自身属性,排除原型链属性。
  2. 缺失键判断:直接检查键是否存在于obj2,不存在则存入output1。
  3. 嵌套递归:遇到嵌套对象时递归调用函数,仅当递归结果有有效内容时才添加到输出,避免生成空对象节点。
  4. 值差异处理:非对象类型直接对比值,不相等时保留obj1的值存入output2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:25:30