如何合并具有重复键和值的两个对象

问题描述

我有两个对象如下:

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-6': 4
}

解决方法

您可以对第二个对象的条目执行归约操作以求和每个键的值,使用第一个对象的副本作为初始值。

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);

,

此实用程序函数合并两个对象并对冲突的键求和,包括对 ab 唯一的所有值。

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,'2020-6': 4
}

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

,

这是另一种解决方案

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 并且我们解构包含键和值的数组