首页 > 解决方案 > How to merge two objects with Math operation for the same properties in Javascript

问题描述

For example I have two objects

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

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

I want to combine them into one object with the sum of each properties like this

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

The approach I came up with is

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

However I think there are better ways of doing this. Can you guys give me some other approaches.

标签: javascriptecmascript-6frontend

解决方案


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

它还确保生成的对象具有来自两个对象的所有键,并且obj2obj2缺少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. 这样,我们可以保证将所有属性obj2保留在结果对象中(当obj没有匹配的属性时,它们的值保持不变)。

我也默认为零obj2[key],以防找不到,保证所有属性obj都将传递到结果对象(当obj2没有匹配的属性时,它们的值不变)。

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


推荐阅读