微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将嵌套对象与 JavaScript 中的数组进行比较并返回键相等

如何解决将嵌套对象与 JavaScript 中的数组进行比较并返回键相等

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

所以对于给定的 obj1 喜欢

var obj1 = {
    prop1: "BAR",prop2: "foo",prop3: [
        {
            id: 1,prop4: "foo",prop5: "a"
        },{
            id: 2,prop5: "b"
        },{
            id: 3,prop5: "e"
        }
    ]
}

还有 obj2 喜欢

var obj2 = {
    prop1: "FOO",prop4: "bar",{
            id: 4,prop5: "e"
        }
    ],prop6: "new"
}

它应该返回

var equality = {
    prop1: false,prop2: true,prop4: false,prop5: false
        },prop4: true,prop4: null,prop5: null
        },prop5: true
        }
    ],prop6: true
}

我必须比较两个对象并为相同的值返回 true。对于数组内部,我必须与 ID(key) 进行比较并检查 prop4、prop 5 是否已更改,如果更改则返回 false。 对于 obj 1 中的数据而不存在于 obj 2 => 我们可以忽略或显示为 null,如结果(相等)所示 对于 obj 2 中的数据而不存在于 obj 1 => 中的所有道具都应标记为 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,prop5: "b" }] }
var obj2 = { prop1: 3,prop4: "bar",prop5: "b" },{ number: 3,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));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。