如何合并并获取两个对象的值之和与对象具有相同的键

时间:2019-09-18 15:21:12

标签: javascript object javascript-objects

对于图表实现,我有两个对象需要展平。

2019-09-12: {
        type1: {
            subType1: {
                   value: 5
                      },
            subType2: {…}               
                },
        type2: {
             subType1: {
                   value: 8
                      },
            subType2: {…} 
               }
        }

这需要变成这个;

cumulated: {
        subType1: {
               value: 13
                  },
        subType2: {sum}               
            }

4 个答案:

答案 0 :(得分:1)

您可以使用lodash library。例如

var object = {
  'a': [{ 'b': 2 }, { 'd': 4 }]
};

var other = {
  'a': [{ 'c': 3 }, { 'e': 5 }]
};

_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }

答案 1 :(得分:1)

    var obj = {"2019-09-12": {
        type1: {
            subType1: {
                   value: 5
                      },
            subType2: {value: 7}               
                },
        type2: {
             subType1: {
                   value: 8
                      },
            subType2: {value: 9} 
               }
        }}
var sumType1 = 0;
var sumType2 = 0;
function cumul(){
  Object.keys(obj).forEach(function(date){
  Object.keys(obj[date]).forEach(function(typeValue){
    sumType1 += obj[date][typeValue].subType1.value;
    sumType2 += obj[date][typeValue].subType2.value;
  })
})
return {
  cumulated: {
        subType1: {
               value: sumType1
                  },
        subType2: {sumType2}               
            }
}
}

console.log(cumul())

答案 2 :(得分:1)

您可以遍历对象的键并对它们求和。

const obj = {
  type1: {
    subType1: {
      value: 5
    },
    subType2: {
      value: 1
    },
  },
  type2: {
    subType1: {
      value: 8
    },
    subType2: {
      value: 2
    }
  }
};

const combine = (obj) => Object.keys(obj).reduce((res, cur) => {
    for (let key of Object.keys(obj[cur])) {
      if (res.hasOwnProperty(key)) {
        res[key].value += obj[cur][key].value;
      } else {
        res[key] = obj[cur][key];
      }
    };
    return res;
}, {});

console.log(combine(obj));

答案 3 :(得分:0)

谢谢大家! 这是我最后想出的:

我使用过lodash库,但是它确实快速又干净。同样,物体的形状也不重要,它的深度可以达到物体的深度

import mergeWith from 'lodash/mergeWith'

mergeWith({}, ...Object.values(objectThatNeedsToCollapse), (objValue, srcValue) =>
typeof objValue === "number" ? objValue + srcValue : undefined
)