Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何合并和获取两个对象和对象具有相同键的值之和_Javascript_Object_Javascript Objects - Fatal编程技术网

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

Javascript 如何合并和获取两个对象和对象具有相同键的值之和,javascript,object,javascript-objects,Javascript,Object,Javascript Objects,我有两个对象需要展平以实现图表 2019-09-12: { type1: { subType1: { value: 5 }, subType2: {…} }, type2: { subType1: { value

我有两个对象需要展平以实现图表

2019-09-12: {
        type1: {
            subType1: {
                   value: 5
                      },
            subType2: {…}               
                },
        type2: {
             subType1: {
                   value: 8
                      },
            subType2: {…} 
               }
        }
这需要变成这样,

cumulated: {
        subType1: {
               value: 13
                  },
        subType2: {sum}               
            }
你可以用。比如说

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 }] }

可以迭代对象的键并求和

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));
谢谢大家! 以下是我在最后得出的结论:

我用过lodash图书馆,但它真的很快很干净。物体的形状也不重要,它可以像你的物体一样深

import mergeWith from 'lodash/mergeWith'

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

问题是我把所有的东西都当作对象,没有任何数组让我使用,也有两个层次的Merging是的,它也可以工作。你能试试lodash函数merge吗?看看原始的输入和输出,看起来请求是通过求和来组合相似的键。不是merge,而是merge with方法起作用。merge覆盖需要求和的值,但是我添加了这个函数来mergeWith()
(objValue,srcValue,key,object,source,stack)=>{console.log(JSON.stringify({objValue,srcValue})),如果(typeof objValue==“number”)返回objValue+srcValue}
并且它可以正常工作,谢谢!然而,我从es lint
中得到这个警告,迭代器/生成器需要再生器运行时,这对于本指南来说太重了,不允许它们使用。另外,应该避免循环,以利于数组迭代。
这给了我一个方向,唯一可以优化它的东西是你可以尝试将(…)的
更改为
Object.keys(obj[cur])。forEach(…)
它工作得很好,非常不同于我所想的方法,谢谢
import mergeWith from 'lodash/mergeWith'

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