JavaScript中比较嵌套对象和数组的键是否相等

3
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有两个嵌套的对象obj1和obj2,我想比较它们并递归返回一个对象,该对象对于每个嵌套键都具有类似等式的布尔标志。

因此,对于给定的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(键)进行比较,并检查prop4、prop5是否已更改。如果已更改,则返回false。 对于obj1中的数据而在obj2中不存在=>我们可以将其显示为null,如结果(相等性)所示 对于obj2中存在但在obj1中不存在的数据=>应标记为其中所有属性都为true。
Nina Scholz在Compare nested objects in JavaScript and return keys equality中提供的解决方案帮助了我,但唯一的问题是对于prop3,我得到的是嵌套字段,但我需要它与数组具有相同的格式。
如果有人能给出正确的解决方案,那对我来说会非常有帮助。我是JavaScript的新手,学习它会帮助我很多。

为什么 equality.prop1true?因为 obj1.prop1 不等于 obj2.prop1,难道不应该是 false 吗? - Nur
是的,它应该是错误的。我会编辑问题。谢谢你指出。 - arun kumar v
你为什么要保留 number - Nur
1
好的!我们正在检查,如果 key'number',并且两个对象都应该有它,并且两个对象中的 number 应该相等...明白了吗? - Nur
不是与数组索引进行比较,而是与数字进行比较,我必须比较两个数组中的数字,并针对该特定数字索引内的道具返回true或false?现在清楚了吗,还是让您更困惑了?为了明确起见,我必须将数字1的项目与obj1和2中的数字1的项目进行比较,并查看prop4和prop5是否相同或不同。对于特殊情况,例如obj1中的数字3(在obj2中已删除),我可以忽略它,因为它不在obj2中,但是对于obj2中未出现在obj1中的数字4(在obj2中添加) ,我必须显示为true。 - arun kumar v
显示剩余13条评论
1个回答

3

一些棘手的递归可以完成这项工作。

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));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接