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

标签 javascript arrays json compare

我有两个嵌套对象 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/

相关文章:

javascript - 到达 JS DOM 对象?

javascript - 从 onclick 调用 JQuery 对话框

javascript - 将参数传递给 array.prototype.findIndex(callback[, thisArg])

javascript - 将项目数组拆分为 N 个数组

javascript - 一个采用跳过模式的函数,该模式将采用数组并返回新的 arr

javascript - Firefox 选项卡拖动导致 Javascript 警报失败

arrays - 如何找到数组中每个项目的字符数

Java网络客户端: How to serialize to Pascal JSON?

javascript - 从 JSON 对象中的数组获取数据

php - 以 json 形式返回表行并打印