找出两个 JavaScript Objects 之间的差异

Finding the differences between two JavaScript Objects

是的,有很多标题与此类似的问题,我可以向您保证我已经测试了几乎所有问题。一切 Google 都向我袭来,我试过了。 None 够了。

考虑到这两个 object:

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

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

如何通过 top-level 键找到 o2o1 之间的差异,我相信 没有 “破坏” object 通过将属性的值设置为 undefined(老实说,我发现这里的答案很荒谬)。

为什么我需要这个?这里描述的 o1 包含“所有数据”和 o2 将被删除的子集,以便我可以执行更新。您可以将 if 视为交集的倒数。

在上面的 pseudo-code 中,我想要的输出是:

const diff = {
  "someProperty": "someValue"
}

当然,这是一个过于简单的例子,在实际交易中我有许多其他属性,具有不同的值,总是原始的data-tyes(纯文本、整数、布尔值...)one-level 嵌套(如 o2)或深入更多层次,但始终是原始类型。

听起来很简单,但如果没有 NodeJS、Lodash、Underscore 或任何其他第 3 方库,我就找不到任何东西。

您可以获取条目并进行核对。对于对象执行相同的操作并检查结果是否有一些键。

const
    getDifference = (a, b) => Object.fromEntries(Object
        .entries(a)
        .reduce((r, [k, v]) => {
            if (v && typeof v === 'object') {
                let temp = getDifference(v, b[k] || {});
                if (Object.keys(temp).length) r.push([k, temp]);
            } else {
                if (v !== b[k]) r.push([k, v]);
            }
            return r;
        }, [])
    ),
    o1 = { someProperty: "someValue", anotherProperty: { p1: "v1", p2: "v2", p3: 'v3' }, n1: { n2: { n3: 42 } } },
    o2 = { someProperty: "someValue", anotherProperty: { p1: "v1", p2: "v2" } },
    o3 = { anotherProperty: { p1: "v1", p2: "v2" } };

console.log(getDifference(o1, o3));
console.log(getDifference(o2, o3));
.as-console-wrapper { max-height: 100% !important; top: 0; }