首页 > 解决方案 > 在 JavaScript 中合并多维对象

问题描述

默认对象

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_3

编辑

只是想注意,对象不会总是保持view,或者create它可能真的是任何东西,但它永远不会在维度上更深。

标签: javascript

解决方案


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

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


推荐阅读