如何合并对象 - lodash?

How to merge object - 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

如有建议将不胜感激

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

此方法如下所示:

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

这是您的示例中使用的:

https://jsfiddle.net/82koarwq/

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

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

  • 如果第一个对象包含键,它添加键及其值。
  • 如果第一个对象已经包含键,它将覆盖它的值。

通过使用 mergeWith,您有机会改写此行为。您可以传递一个用于处理第二种情况的方法。如果你想回到默认的合并行为,你必须让你的方法 return 未定义。

试试这个更新后的 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)