使用Lodash深度合并

ben*_*man 15 javascript arrays merge lodash

我有两个对象数组,其中包含具有标签和实际地址对象的地址:

var originalAddresses = [
  {
    label: 'home',
    address: { city: 'London', zipCode: '12345' }
  },
  {
    label: 'work',
    address: { city: 'New York', zipCode: '54321' }
  }
];

var updatedAddresses = [
  {
    label: 'home',
    address: { city: 'London (Central)', country: 'UK' }
  },
  {
    label: 'spain',
    address: { city: 'Madrid', zipCode: '55555' }
  }
];
Run Code Online (Sandbox Code Playgroud)

现在我想合并这些数组label并比较地址的各个属性,并仅合并实际存在的新地址的属性.所以结果应该是这样的:

var result = [
  {
    label: 'home',
    address: { city: 'London (Central)', zipCode: '12345', country: 'UK' }
  },
  {
    label: 'work',
    address: { city: 'New York', zipCode: '54321' }
  },
  {
    label: 'spain',
    address: { city: 'Madrid', zipCode: '55555' }
  }
]
Run Code Online (Sandbox Code Playgroud)

我怎么能用lodash做到这一点我试过的组合unionBy()merge().使用unionBy(),我能够按标签比较和连接数组,但这总是替换整个对象.我可以肯定合并地址,但这不会发生在标签上.

Ori*_*ori 21

您可以使用_.keyBy(arr, 'label'),然后使用_.merge()以下方法将两个数组转换为对象:

var originalAddresses = [{
  label: 'home',
  address: {
    city: 'London',
    zipCode: '12345'
  }
}, {
  label: 'work',
  address: {
    city: 'New York',
    zipCode: '54321'
  }
}];

var updatedAddresses = [{
  label: 'home',
  address: {
    city: 'London (Central)',
    country: 'UK'
  }
}, {
  label: 'spain',
  address: {
    city: 'Madrid',
    zipCode: '55555'
  }
}];

var result = _.values(_.merge(
  _.keyBy(originalAddresses, 'label'),
  _.keyBy(updatedAddresses, 'label')
));

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)