我有两个嵌套对象 obj1 和 obj2,我想比较它们并递归返回一个对象,每个嵌套键都有一个类似相等的 bool 标志
所以对于给定的 obj1
就像
var obj1 = {
prop1: "BAR",
prop2: "foo",
prop3: [
{
id: 1,
prop4: "foo",
prop5: "a"
},
{
id: 2,
prop4: "foo",
prop5: "b"
},
{
id: 3,
prop4: "foo",
prop5: "e"
}
]
}
和 obj2
一样
var obj2 = {
prop1: "FOO",
prop2: "foo",
prop3: [
{
id: 1,
prop4: "bar",
prop5: "b"
},
{
id: 2,
prop4: "foo",
prop5: "a"
},
{
id: 4,
prop4: "foo",
prop5: "e"
}
],
prop6: "new"
}
它应该返回
var equality = {
prop1: false,
prop2: true,
prop3: [
{
id: 1,
prop4: false,
prop5: false
},
{
id: 2,
prop4: true,
prop5: false
},
{
id: 3,
prop4: null,
prop5: null
},
{
id: 4,
prop4: true,
prop5: true
}
],
prop6: true
}
我必须比较两个对象并为相同的值返回 true。对于数组内部,我必须与 ID(key) 进行比较并检查 prop4、prop 5 是否已更改,如果更改则返回 false。 对于 obj 1 中的数据但 obj 2 中不存在的数据 => 我们可以忽略显示为 null,如 result(equality) 所示 对于 obj 2 中的数据但 obj 1 中不存在的数据 => 应将其中的所有 Prop 标记为 true。
Nina Scholz 在 Compare nested objects in JavaScript and return keys equality 中给出的解决方案对我有帮助,但我面临的唯一问题是 prop3 我得到的是嵌套字段,但我需要它与数组的格式相同。
如果有人得到正确的解决方案,那将对我非常有帮助。我是 JavaScript 的新手,学习它会对我有很大帮助。
最佳答案
一些棘手的递归可以完成这项工作。
var obj1 = { prop1: 1, prop2: "foo", prop3: [{ number: 1, prop4: "foo", prop5: "a" }, { number: 2, prop4: "foo", prop5: "b" }] }
var obj2 = { prop1: 3, prop2: "foo", prop3: [{ number: 1, prop4: "bar", prop5: "b" }, { number: 2, prop4: "foo", prop5: "a" }, { number: 3, prop4: "foo", prop5: "e" }], prop6: "new" }
const isObject = v => v !== null && typeof v == "object";
function getDifference(x, y = x) {
if (x === undefined) x = y;
if (Array.isArray(x) && Array.isArray(y)) {
const temp = [];
for (let i = 0; i < (x.length + y.length) / 2; i++)
temp.push(getDifference(x[i], y[i]))
return temp;
}
if (isObject(x) && isObject(y)) {
const temp = {};
for (const key of new Set([...Object.keys(x), ...Object.keys(y)]))
temp[key] = getDifference(x[key], y[key])
return temp;
}
return x === y;
}
console.log(getDifference(obj1, obj2));
关于javascript - 将嵌套对象与 JavaScript 中的数组进行比较并返回键相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67206511/