При выполнении mergeWith
необходимо передать настройщик.Затем Lodash выполняет рекурсивное слияние значений.
Хитрость в том, что если ваш настройщик возвращает undefined
, то merge
используется для объединения значений.Однако, поскольку add
возвращает NaN
для несовместимых значений, вместо этого используется это значение - поэтому, если у вас просто есть функция, которая работает как add
, но возвращает undefined
вместо NaN
, тогда mergeWith
будет делатьвсе тяжелые работы для вас:
const object1 = {first: [{a: 0, b:3}], second: [{a: 1, b:2}], third: [{a: 3, b:2}]}
const object2 = {first: [{a: 1, b:0}], second: [{a: 10, b:0}], third: [{a: 2, b:3}]}
const res = _.mergeWith({}, object1, object2, customizer)
console.log(res);
function customizer(a, b) {
// you can still use add
const result = _.add(a, b);
// ignore NaN values and return undefined instead
if (_.isNaN(result)) {
return;
}
//only combine values that can be combined
return result;
}
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
Альтернативный более короткий способ выразить это с помощью defaultTo
const object1 = {first: [{a: 0, b:3}], second: [{a: 1, b:2}], third: [{a: 3, b:2}]}
const object2 = {first: [{a: 1, b:0}], second: [{a: 10, b:0}], third: [{a: 2, b:3}]}
const customizer = (a, b) => _.defaultTo(_.add(a, b), undefined)
const res = _.mergeWith({}, object1, object2, customizer)
console.log(res);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>