如何将多个对象合并为一个并处理打字稿中的重复键

时间:2019-01-24 15:27:08

标签: angular algorithm typescript

我正在使用ng2-chart,我需要填充水平条形图。 我将值存储在keys.forEach内,图表数据的结果console.log是(示例):

{ReasonA: 5}
{ReasonA: 5, ReasonB: 5}
{ReasonA: 1, ReasonB: 3, ReasonC: 2}
{ReasonA: 1, ReasonB: 4, ReasonE: 2}

我需要将对象合并为一个,并为同一个键处理多个值。此示例的期望结果将是以下对象:

{ReasonA: 12, ReasonB: 12, ReasonC: 2, ReasonE: 2}

有了那个对象,我就可以拆分键和值并填充图表。您可以引导我进入如何将4个对象合并为所需结果吗?

谢谢。

3 个答案:

答案 0 :(得分:5)

如果所有属性都是数字,则使用数组reduce是非常简单的逻辑。如果属性具有不同的类型,则逻辑将稍微复杂一些。这是您可以编写以实现此功能的示例:

function sumProperties(...objects: { [key: string]: number }[]) {
  return objects.reduce((acc, obj) => {
    for (let key in obj) {
      let a = acc[key] || 0;
      let b = obj[key];
      acc[key] = a + b;
    }

    return acc;
  }, {});
}

示例用法:

sumProperties(
  {ReasonA: 5},
  {ReasonA: 5, ReasonB: 5},
  {ReasonA: 1, ReasonB: 3, ReasonC: 2},
  {ReasonA: 1, ReasonB: 4, ReasonE: 2},
)

答案 1 :(得分:2)

您还可以使用boxplotforEach获取每个对象密钥,并检查它是否存在于Object.keys对象中,如果存在,则加上值​​,如果不存在,则分配新的值

result

答案 2 :(得分:0)

如果使用lodash,则可以使用_.extendWith来减少代码量:)

_.extendWith({ReasonA: 5},
             {ReasonA: 5, ReasonB: 5},
             {ReasonA: 1, ReasonB: 3, ReasonC: 2},
             {ReasonA: 1, ReasonB: 4, ReasonE: 2}, 
             (obj, src) => (obj||0) + (src||0))