找出两个 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 键找到 o2
和 o1
之间的差异,我相信 没有 “破坏” 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; }
是的,有很多标题与此类似的问题,我可以向您保证我已经测试了几乎所有问题。一切 Google 都向我袭来,我试过了。 None 够了。
考虑到这两个 object:
const o1 = {
"someProperty": "someValue",
"anotherProperty": {
"p1": "v1",
"p2": "v2"
}
}
const o2 = {
"anotherProperty": {
"p1": "v1",
"p2": "v2"
}
}
如何通过 top-level 键找到 o2
和 o1
之间的差异,我相信 没有 “破坏” 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; }