Lodash - 在条件下合并两个数组的对象

Mis*_*esh 4 javascript arrays collections lodash

我有两个对象数组。

arr1 = [
  {
    myName: 'Adam',
    mySkill: 'CSS',
  },
  {
    myName: 'Mutalib',
    mySkill: 'JavaScript',
  },
];

arr2 = [
  {
    myName: 'Adam',
    myWeight: '112',
  },
  {
    myName: 'Habib',
    myWeight: '221',
  },
];
Run Code Online (Sandbox Code Playgroud)

我想要的结果是一个数组,其中包含第一个数组的对象,这些对象在第二个数组中具有匹配的属性“myName”,以及相应的第二个数组对象的附加属性。

result = [
  {
    myName = 'Adam'
    mySkill = 'CSS'
    myWeight = '112'
  }
];
Run Code Online (Sandbox Code Playgroud)

rye*_*lar 7

下面的解决方案级联阵列(arr1arr2通过)myName,将删除只包含使用一个项目的所有组拒绝,最后使用地图合并所得到的数组。

var result = _(arr1)
  .concat(arr2)
  .groupBy('myName')
  .reject({ length: 1 })
  .map(_.spread(_.merge))
  .value();
Run Code Online (Sandbox Code Playgroud)

var result = _(arr1)
  .concat(arr2)
  .groupBy('myName')
  .reject({ length: 1 })
  .map(_.spread(_.merge))
  .value();
Run Code Online (Sandbox Code Playgroud)
var arr1 = [
  {
    myName: 'Adam',
    mySkill: 'CSS',
  },
  {
    myName: 'Mutalib',
    mySkill: 'JavaScript',
  }
];

var arr2 = [
  {
    myName: 'Adam',
    myWeight: '112',
  },
  {
    myName: 'Habib',
    myWeight: '221',
  }
];

var result = _(arr1)
  .concat(arr2)
  .groupBy('myName')
  .reject({ length: 1 })
  .map(_.spread(_.merge))
  .value();

console.log(result);
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用intersectionWith获取两个数组之间的交集并同时分配缺失值。请注意使用cloneDeep来促进不变性。

var result = _.intersectionWith(_.cloneDeep(arr1), arr2, function(x, y) {
  return x.myName === y.myName && _.assign(x, y);
});
Run Code Online (Sandbox Code Playgroud)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)
var result = _.intersectionWith(_.cloneDeep(arr1), arr2, function(x, y) {
  return x.myName === y.myName && _.assign(x, y);
});
Run Code Online (Sandbox Code Playgroud)