Javascript循环遍历对象并插入丢失的键,即使在儿童中

Leo*_*oni 3 javascript nested object

我需要同步两个 javascript 对象,我想用 object1 中缺少的键填充 object2,而不替换现有的键,即使是嵌套的:

var object1 = {
    firstName: "Marco",
    lastName: "Rossi",
    favoriteFood: {firstCourse: "pasta", secondCourse: "salsiccia"},
    favoriteDrink: "Vino",
    favoriteSong: "O sole mio"
}

var object2 = {
    firstName: "Marco",
    lastName: "Rossi",
    favoriteFood: {firstCourse: "pasta"},
    favoriteSong: "Viaggiare"
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道如何进入嵌套键。特别是为了继续检查内部巢穴,如果您有 5 个巢穴或类似的东西,我知道如何处理第一级而不是更远的巢穴怎么办。

objec2 的期望结果是

var object2 = {
    firstName: "Marco",
    lastName: "Rossi",
    favoriteFood: {firstCourse: "pasta", secondCourse: "salsiccia"},
    favoriteDrink: "Vino",
    favoriteSong: "Viaggiare"
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助。

dfs*_*fsq 7

您需要编写递归函数来处理嵌套对象。也许是这样的:

var object1 = {
    firstName: "Marco",
    lastName: "Rossi",
    favoriteFood: {firstCourse: "pasta", secondCourse: "salsiccia"},
    favoriteMovie: {rating: 7, title: "Monday"},
    favoriteDrink: "Vino",
    favoriteSong: "O sole mio"
}

var object2 = {
    firstName: "Marco",
    lastName: "Rossi",
    favoriteFood: {firstCourse: "pasta"},
    favoriteSong: "Viaggiare"
}

function fillObject(from, to) {
    for (var key in from) {
        if (from.hasOwnProperty(key)) {
            if (Object.prototype.toString.call(from[key]) === '[object Object]') {
                if (!to.hasOwnProperty(key)) {
                    to[key] = {};
                }
                fillObject(from[key], to[key]);
            }
            else if (!to.hasOwnProperty(key)) {
                to[key] = from[key];
            }
        }
    }
}

fillObject(object1, object2);

alert( JSON.stringify(object2, null, '    ') );
Run Code Online (Sandbox Code Playgroud)

注意:如果你想知道这一行Object.prototype.toString.call(from[key])- 这是为了可靠地检查 value 是一个对象,因为typeof null也报告object.