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

寻求快速获取两个对象差异的高效代码实现方案

高效获取对象差异(删除属性标记为"deleted")

需求说明

频繁执行对象差异对比,需输出符合以下规则的结果:

  • 对象2中新增或修改的属性值直接保留
  • 对象1存在但对象2不存在的属性,标记为"deleted"
  • 嵌套对象递归处理,数组视为整体(若对象2中无对应数组属性,直接标记为"deleted")

高效实现代码

function getObjectDiff(obj1, obj2) {
  const diff = {};
  // 处理obj1属性:标记删除、对比修改/嵌套对象
  for (const key in obj1) {
    if (!obj2.hasOwnProperty(key)) {
      diff[key] = 'deleted';
    } else {
      const val1 = obj1[key];
      const val2 = obj2[key];
      // 仅递归处理非数组的嵌套对象
      if (typeof val1 === 'object' && val1 !== null && !Array.isArray(val1) &&
          typeof val2 === 'object' && val2 !== null && !Array.isArray(val2)) {
        const nestedDiff = getObjectDiff(val1, val2);
        if (Object.keys(nestedDiff).length > 0) {
          diff[key] = nestedDiff;
        }
      } else if (val1 !== val2) {
        diff[key] = val2;
      }
    }
  }
  // 处理obj2新增属性
  for (const key in obj2) {
    if (!obj1.hasOwnProperty(key)) {
      diff[key] = obj2[key];
    }
  }
  return diff;
}

代码高效性说明

  • 用hasOwnProperty直接判断属性归属,避免遍历原型链
  • 递归仅针对非数组嵌套对象,减少递归层级开销
  • 仅当嵌套对象存在差异时才加入结果,避免生成无意义的空对象
  • 分两次循环处理不同场景,逻辑清晰且执行效率高

示例验证

const obj1 = {a: "hi", b: "hi", c: {o: "hi", p: "hi"}, d: ["hi", "bye"]};
const obj2 = {a: "hi", b: "bye", c: {o: "bye"}, e: "new"};

const result = getObjectDiff(obj1, obj2);
console.log(result);
// 输出:{b: "bye", c: {o: "bye", p: "deleted"}, d: "deleted", e: "new"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:05:19