如何递归合并两个对象?

时间:2017-11-15 14:55:48

标签: javascript

我有以下两个对象:

var objectA = {
    "a": [
        {
            "col": 1,
            "row": 1,
            "pnl": 1.0
        },
        {
            "col": 1,
            "row": 2,
            "pnl": 2.0
        },
    ]
};

var objectB = {
    "a": [
        {
            "col": 1,
            "row": 1,
            "sharpe": 1.5
        },
        {
            "col": 1,
            "row": 2,
            "sharpe": 2.5
        },
    ]
};

我想得到:

var objectC = {
    "a": [
        {
            "col": 1,
            "row": 1,
            "pnl": 1.0,
            "sharpe": 1.5
        },
        {
            "col": 1,
            "row": 2,
            "pnl": 2.0,
            "sharpe": 2.5
        },
    ]
};

3 个答案:

答案 0 :(得分:3)

您可以使用哈希表来引用相同的键和列/行项。如果没有可用的哈希值,则更新对象或分配新对象。



var objectA = { a: [{ col: 1, row: 1, pnl: 1.0 }, { col: 1, row: 2, pnl: 2.0 }] },
    objectB = { a: [{ col: 1, row: 1, sharpe: 1.5 }, { col: 1, row: 2, sharpe: 2.5 }] },
    hash = Object.create(null);

Object.keys(objectA).forEach(function (k) {
    hash[k] = hash[k] || {};
    objectA[k].forEach(function (o) {
        var key = ['col', 'row'].map(function (l) { return o[l]; }).join('|');
        hash[k][key] = o;
    });
});

Object.keys(objectB).forEach(function (k) {
    if (!hash[k]) {
        objectA[k] = objectB[k];
        return;
    }
    objectB[k].forEach(function (o) {
        var key = ['col', 'row'].map(function (l) { return o[l]; }).join('|');
        if (hash[k][key]) {
            Object.keys(o).forEach(function (l) {
                hash[k][key][l] = o[l];
            });
        } else {
            objectA[k].push(o);
        }
    });
});

console.log(objectA);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:1)

在这种情况下,我会使用lodash的_.merge方法。

  

此方法与_.assign类似,不同之处在于它以递归方式将源对象的自身和继承的可枚举字符串键控属性合并到目标对象中。如果存在目标值,则跳过解析为未定义的源属性。数组和普通对象属性以递归方式合并。其他对象和值类型由赋值覆盖。源对象从左到右应用。后续来源会覆盖以前来源的属性分配。

var object = {
  'a': [{ 'b': 2 }, { 'd': 4 }]
};

var other = {
  'a': [{ 'c': 3 }, { 'e': 5 }]
};

_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }

https://lodash.com/docs/4.17.4#merge

或者,如果您需要它不属于图书馆,请查看lodash’s implementation

答案 2 :(得分:0)

只需使用Object.assign合并对象:



var json1 = {"a":[ 
               {
                 "col": 1, 
                 "row": 1,
                 "pnl": 1.0
               },
               {
                 "col": 1, 
                 "row": 2,
                 "pnl": 2.0
               },  
           ]};

var json2 = {"a":[ 
               {
                 "col": 1, 
                 "row": 1,
                 "sharpe": 1.5
               },
               {
                 "col": 1, 
                 "row": 2,
                 "sharpe": 2.5
               },  
           ]};
           
 var objectC = { a: json1.a.map((el, index) => Object.assign({}, el, json2.a[index])) };
 console.log(objectC);