Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
90
rated 0 times [  96] [ 6]  / answers: 1 / hits: 87952  / 8 Years ago, wed, august 31, 2016, 12:00:00

I have two arrays of objects that contain addresses that have a label and an object for the actual address:



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


Now I want to merge these arrays by label and compare the individual properties of the addresses and merge only the properties from the new address that are actually present. So the result should look like this:



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


How can I do this using lodash? I tried a combination of unionBy() and merge(). With unionBy() I was able to compare and join the arrays by label, but this always replaces the whole object. I can sure merge the addresses but this doesn't happen by label then.


More From » arrays

 Answers
10

You can turn both arrays into objects using _.keyBy(arr, 'label'), and then merge deep using _.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>




[#60860] Monday, August 29, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
dylondaytond

Total Points: 92
Total Questions: 88
Total Answers: 96

Location: China
Member since Fri, Jan 15, 2021
3 Years ago
dylondaytond questions
Tue, Jun 22, 21, 00:00, 3 Years ago
Thu, May 7, 20, 00:00, 4 Years ago
;