Использовать слияние с Lodash с вложенными объектами - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть два таких объекта:

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 = {first: [{a: 1, b:3}], second: [{a: 11, b:2}], third: [{a: 5, b:5}]}

Я попытался использовать mergeWith из Lodash следующим образом:

const res = mergeWith({}, object1, object2, add)

но я получаю:

{first: NaN, second: NaN, third: NaN}

Как я могу использовать mergeWith с вложенными объектами?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

При выполнении 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>
0 голосов
/ 10 декабря 2018

Определение того, как добавить объекты, сделало свое дело:

const res = mergeWith(object1, object2, (objValue, srcValue) =>
    [{
        a: objValue[0].a + srcValue[0].a,
        b: objValue[0].b + srcValue[0].b
    }]
)
...