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

如何不依赖第三方库获取两个JavaScript对象的差异内容

实现代码

// 深度相等判断工具函数
function deepEqual(a, b) {
    if (typeof a !== typeof b) return false;
    // 原始类型、null、undefined直接判等
    if (typeof a !== 'object' || a === null || b === null) return a === b;
    const keysA = Object.keys(a);
    const keysB = Object.keys(b);
    // 键数量不一致直接不相等
    if (keysA.length !== keysB.length) return false;
    // 递归对比所有属性
    for (const key of keysA) {
        if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
    }
    return true;
}

// 求对象差集主函数:返回o1中不在o2完全匹配范围内的顶级键值对
function getObjectDiff(o1, o2) {
    const diffResult = {};
    for (const topKey of Object.keys(o1)) {
        // 仅当o2存在该顶级键、且值深度完全相等时才剔除,否则保留
        if (!o2.hasOwnProperty(topKey) || !deepEqual(o1[topKey], o2[topKey])) {
            diffResult[topKey] = o1[topKey];
        }
    }
    return diffResult;
}

测试用例

const o1 = {
  "someProperty": "someValue",
  "anotherProperty": {
    "p1": "v1",
    "p2": "v2"
  }
}

const o2 = {
  "anotherProperty": {
    "p1": "v1",
    "p2": "v2"
  }
}

const diff = getObjectDiff(o1, o2);
console.log(diff); // 输出 {someProperty: "someValue"},完全符合预期

特性说明

  • 纯函数实现,不会修改原始o1、o2对象
  • 支持任意深度嵌套对象对比,适配多层嵌套、值为原始类型的场景
  • 无任何第三方依赖,可直接在所有ES6+兼容的JavaScript环境中运行
  • 严格遵循顶级键匹配规则:只有o1的顶级键在o2中存在,且对应值深度完全相等时才会被排除,其余场景均保留o1的对应键值对

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:54:10