代码之家  ›  专栏  ›  技术社区  ›  Joji

如何在javascript中对同一属性进行数学运算合并两个对象

  •  0
  • Joji  · 技术社区  · 6 年前

    例如,我有两个对象

    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 回复  |  直到 6 年前
        1
  •  1
  •   tex    6 年前

    这和你的版本没什么不同,但我觉得稍微干净一点。

    它还确保生成的对象具有来自这两个对象的所有键,并且对于 obj2 时值 目标2 缺少一把钥匙 obj .

    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 . 这样,我们就保证拥有 目标2 保留在结果对象中(当 OBJ 没有匹配的属性)。

    我也默认为零 obj2[key] 如果找不到,确保 OBJ 将传递到结果对象(当 Obj2 没有匹配的属性)。

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