如何合并对象 - lodash?

时间:2016-04-05 07:13:06

标签: javascript lodash

我最近开始使用lodash,我想合并以下对象。

对象:

var firstObj =

{
   "1" : [
           {
             name: "karthick",
             age : 25
           },

           {
             name: "arun",
             age : 20
            }
         ],
    "2" : [
           {
             name: "varun",
             age : 25
           },

           {
             name: "smith",
             age : 20
            }
         ]
}    

var secondObj =

{
   "1" : [
           {
             name: "gautham",
             age : 17
           },

           {
             name: "mathan",
             age : 19
            }
         ],
    "2" : [
           {
             name: "ashok",
             age : 16
           },

           {
             name: "dharani",
             age : 20
            }
         ]
}

合并对象/结果:

{
   "1" : [
           {
             name: "karthick",
             age : 25
           },

           {
             name: "arun",
             age : 20
            },
           {
             name: "gautham",
             age : 17
           },

           {
             name: "mathan",
             age : 19
            }
        ]
    "2" : [
           {
             name: "varun",
             age : 25
           },

           {
             name: "smith",
             age : 20
            },
           {
             name: "ashok",
             age : 16
           },

           {
             name: "dharani",
             age : 20
            }
        ]
}    

我曾尝试过:

Fiddle

任何建议都将不胜感激

2 个答案:

答案 0 :(得分:1)

在您可以阅读的文档中,您必须使用自定义程序函数为您查询数组。 (https://lodash.com/docs#mergeWith

此方法如下所示:

function customizer(objValue, srcValue) {
  if (_.isArray(objValue)) {
    return objValue.concat(srcValue);
  }
}

以下是您的示例中使用的内容:

https://jsfiddle.net/82koarwq/

如果您想更好地了解合并方法中发生的事情:

Merge将传递的第一个对象作为基础。然后循环遍历其传递的其他对象中的所有键(按参数顺序)。它做了两件事:

  • 如果第一个对象包含密钥,则添加密钥及其值。
  • 如果第一个对象已经包含该键,则将覆盖其值。

通过使用 mergeWith ,您有机会覆盖此行为。您可以传递用于处理第二种情况的方法。如果你想要回到默认的合并行为,你必须让你的方法返回undefined。

答案 1 :(得分:1)

尝试更新fiddle

var output = {};
var firstObjKeys = Object.keys(firstObj);
var secondObjKeys = Object.keys(secondObj).filter(function(val){
  return firstObjKeys.indexOf(val) == -1;
});

var allKeys = firstObjKeys.concat(secondObjKeys);
allKeys.forEach(function(val){
  var firstArr = firstObj[val] || [];
  var secondArr = secondObj[val] || [];
  output[val] = firstArr.concat(secondArr);
})
document.body.innerHTML += JSON.stringify(output,0,4)