web-dev-qa-db-fra.com

Fusion profonde avec Lodash

J'ai deux tableaux d'objets qui contiennent des adresses qui ont une étiquette et un objet pour l'adresse réelle:

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' }
  }
];

Maintenant, je veux fusionner ces tableaux par label et comparer les propriétés individuelles des adresses et fusionner uniquement les propriétés de la nouvelle adresse qui sont réellement présentes. Le résultat devrait donc ressembler à ceci:

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' }
  }
]

Comment puis-je faire cela en utilisant lodash ? J'ai essayé une combinaison de unionBy() et merge(). Avec unionBy (), j'ai pu comparer et joindre les tableaux par étiquette, mais cela remplace toujours tout l'objet. Je peux certainement fusionner les adresses, mais cela ne se fait pas par étiquette à ce moment-là.

13
benjiman

Vous pouvez transformer les deux tableaux en objets à l'aide de _.keyBy(arr, 'label') , puis fusionner en profondeur à l'aide de _.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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
18
Ori Drori