【问题标题】:How to merge and get sum of the values two objects has same keys as objects如何合并并获取两个对象与对象具有相同键的值的总和
【发布时间】:2020-01-19 14:38:37
【问题描述】:

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

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

这个需要变成这个;

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

【问题讨论】:

    标签: javascript object javascript-objects


    【解决方案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 }] }
    

    【讨论】:

    • 问题是我将所有东西都作为对象,没有任何数组供我使用
    • 还有2级合并
    • 是的,它也有效。你可以试试 lodash 函数合并吗?
    • 查看原始输入和输出,看起来请求是通过求和它们来组合相似的键。
    • 不是合并,而是与方法合并。合并覆盖需要求和的值,但是我将此函数添加到 mergeWith() (objValue, srcValue, key, object, source, stack) => { console.log(JSON.stringify({ objValue, srcValue })) if (typeof objValue === "number") return objValue + srcValue } 并且它可以工作
    【解决方案2】:
        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())
    

    【讨论】:

    • 效果很好,和我想的很不一样,谢谢
    【解决方案3】:

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

    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));
    

    【讨论】:

    • 按预期工作,谢谢!但是,我从 es-lint iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations. 收到了这个警告,这给了我一个方向,只剩下优化它了
    • 你可以试试把for (...)改成Object.keys(obj[cur]).forEach(...)
    【解决方案4】:

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

    我使用过 lodash 库,但它确实又快又干净。物体的形状也不重要,它可以像你的物体一样深入

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

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多