2016-08-31 3 views
2

У меня есть два массива объектов, которые содержат адреса, которые имеют метку и объект для фактического адреса:Deep Объединить с помощью 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' } 
    } 
]; 

Теперь я хочу, чтобы объединить эти массивы с помощью 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' } 
    } 
] 

Как я могу это сделать с помощью lodash? Я пробовал комбинацию unionBy() и merge(). С unionBy() я смог сравнить и объединить массивы по метке, но это всегда заменяет весь объект. Я могу с уверенностью объединить адреса, но это не происходит по метке.

ответ

6

Вы можете превратить оба массива в объекты, используя _.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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>