如何使用Math操作合并两个对象以获得Javascript中的相同属性

时间:2018-11-27 22:15:30

标签: javascript ecmascript-6 frontend

例如,我有两个对象

const obj = {
  CRITICAL: 0,
  ERROR: 1,
  INFO: 0,
  WARNING: 0,
};

const obj = {
  CRITICAL: 0,
  ERROR: 0,
  INFO: 0,
  WARNING: 1,
};

我想将每个属性的总和像这样组合到一个对象中

{
      CRITICAL: 0,
      ERROR: 1,
      INFO: 0,
      WARNING: 1,
    };

我想出的方法是

Object.keys(obj).reduce((prev,curr)=>{
  prev[curr] = obj[curr] + obj2[curr];
  return prev
},{});

但是我认为有更好的方法可以做到这一点。你们能给我一些其他方法吗?

1 个答案:

答案 0 :(得分:1)

这与您的版本没有太大不同,但我认为它稍微干净一些。

它还可以确保生成的对象具有两个对象中的所有键,并且当obj2缺少obj2中的键时,obj值的默认值为0。 / p>

const obj = {
  CRITICAL: 0,
  ERROR: 1,
  INFO: 0,
  WARNING: 0,
  OBJECT1: 1
}

const obj2 = {
  CRITICAL: 0,
  ERROR: 0,
  INFO: 0,
  WARNING: 1,
  OBJECT2: 1
}

console.log(
  Object.entries(obj).reduce(
    (prev, [key, value])=> {
      prev[key] = value + (prev[key] || 0)
      return prev
    },
    { ...obj2 } // spread to avoid mutating obj2
  )
)

说明:在这里,我已将累加器(prev)初始化为obj2的浅表克隆。这样,我们保证将obj2中的所有属性保留在结果对象中(当obj没有匹配属性时,它们的值不变)。

如果未找到obj2[key],我也默认将其设置为零,以确保obj中的所有属性都将被传递给结果对象(当obj2不存在时,其值保持不变没有匹配的属性。

您可以通过检查值的类型以确保它们是数字来增加一些安全性,但否则,我认为它是合理的。