Как объединить два объекта с дублированным значением суммирования ключей

#javascript #javascript-objects

#javascript #javascript-объекты

Вопрос:

У меня есть два объекта следующим образом:

 const a = {
  '2021-1': 10,
  '2021-2': 8
}
const b = {
  '2021-1': 10,
  '2020-3': 10,
  '2020-4': 15,
  '2020-5': 12,
  '2020-6': 4
}
 

Я хотел бы объединить два объекта и суммировать значения для дублированных ключей.

Ожидаемый результат:

 {
  '2021-1': 20,
  '2021-2': 8,
  '2020-3': 10,
  '2020-4': 15,
  '2020-5': 12,
  '2020-6': 4
}
 

Комментарии:

1. что не работает?

2. можете ли вы приложить решение, как я могу получить результат, используя чистый javascript или Lodash?

Ответ №1:

Вы можете выполнить операцию уменьшения над записями второго объекта, чтобы суммировать значения каждого ключа, используя копию первого объекта в качестве начального значения.

 const a = {
  '2021-1': 10,
  '2021-2': 8
}
const b = {
  '2021-1': 10,
  '2020-3': 10,
  '2020-4': 15,
  '2020-5': 12,
  '2020-6': 4
}
const res = Object.entries(b).reduce((acc,[k,v])=>{
  acc[k] = (acc[k] || 0)   v;
  return acc;
}, {...a});
console.log(res); 

Ответ №2:

Эта служебная функция объединяет два объекта и суммирует конфликтующие ключи, включая все значения, уникальные для либо a или b .

 const mergeWithSum = (a, b) =>
  [...Object.keys(a), ...Object.keys(b)].reduce((combined, key) => {
    combined[key] = (a[key] ?? 0)   (b[key] ?? 0);
    return combined;
  }, {});

const a = {
  '2021-1': 10,
  '2021-2': 8
}
const b = {
  '2021-1': 10,
  '2020-3': 10,
  '2020-4': 15,
  '2020-5': 12,
  '2020-6': 4
}

console.log(mergeWithSum(a, b)); 

Комментарии:

1. Спасибо за ваш ответ, @soimon, но это не работает должным образом. «2021-1» должно быть 20

2. @WilliamWang вы правы, я забыл скобки. Я исправил это, но поскольку принятый ответ iota функционально равен, тривиально, с каким подходом вы идете.

Ответ №3:

вот еще одно решение

 function mergeObj(obja, objb) {
    const merged = {...obja};
    for ([key, value] of Object.entries(objb)) {
        if(merged.hasOwnProperty(key)) {
           merged[key] = merged[key]   value
        } else {
           merged[key] = value
        }
    }
    return merged
}
 

он использует простой цикл for of из object.entries, и мы разрушаем массив, содержащий ключ и значение