在JavaScript中合并多维对象

时间:2018-09-17 19:32:16

标签: javascript

默认对象

The Microsoft Exchange IMAP4 service

要合并的对象

var default_obj = {
    "cloud": {
        "something_1": {
            "view": false,
            "create": false
        },
        "something_2": {
            "view": false,
            "create": false
        },
        "something_3": {
            "view": false,
            "create": false
        },
    }
}

合并后

var merge_obj = {
    "cloud": {
        "something_1": {
            "view": true,
            "create": true
        },
        "something_2": {
            "view": false,
            "create": false
        }
    }
}

我基本上希望第二个对象覆盖默认对象中的所有内容,但是,如果第二个对象中没有找到默认对象中的新信息,则包括在内。

仅通过执行var merge_obj = { "cloud": { "something_1": { "view": true, "create": true }, "something_2": { "view": false, "create": false } "something_3": { "view": false, "create": false } } } 就可以覆盖覆盖的第一部分,但省去了{ ...default_obj, ...merge_obj }

如果有人有任何指导,我将不胜感激。

编辑:只是要注意,这些对象并不总是保持something_3view的确可以是任何东西,但它的尺寸永远不会更深。

4 个答案:

答案 0 :(得分:0)

我不知道是否有内置的功能,但是我本来以为只是循环遍历?

for(var x in merge_obj['cloud']) {
   default_obj['cloud'][ x ] = merge_obj['cloud'][x];
}

还没有进行测试,但是认为它会起作用,因为如果已经存在,它会被覆盖;否则,它将插入。

答案 1 :(得分:0)

您需要递归以遍历属性,可以手动创建此函数,但由于数组和对象之间的相似性以及其他一些条件,因此我建议使用任何库或使用已测试的代码。

这里是示例https://davidwalsh.name/javascript-deep-merge

的链接

答案 2 :(得分:0)

尝试以下npm库:https://www.npmjs.com/package/deep-extend

否则,您必须递归到每个子对象中才能合并它们。

答案 3 :(得分:0)

此函数将在两个对象之间进行合并。

function merge(obj, src) {
     Object.keys(src).forEach(function(key) {          
       if (typeof src[key] === 'object') {
         if (typeof obj[key] === 'undefined') obj[key] = {};

         obj[key] = merge(obj[key], src[key]);
       } else {

         obj[key] = src[key];
       }
     });

  return obj;
}

merge(default_obj, merge_obj)

但是已经有像lodash这样的可用库已经做到了。例: _.merge(default_obj, merge_obj);