合并两个对象并求和相同键值的最佳方法?

min*_*her 5 javascript performance node.js javascript-objects

我有两个与此相似的对象:

let data = [[
  {
    10: {key1: 1, key2: 2, key3: 3},
    11: {key1: 1, key2: 2, key3: 3},
    12: {key1: 1, key2: 2, key3: 3},
    },
  {},
  {}
],
[
  {
    10: {key1: 1, key2: 2, key3: 3},
    11: {key1: 1, key2: 2, key3: 3},
    12: {key1: 1, key2: 2, key3: 3},
    },
  {},
  {}
]]
Run Code Online (Sandbox Code Playgroud)

我想创建一个新对象,并对每个键的每个值求和。像这样:

let newData = [
      {
        10: {key1: 2, key2: 4, key3: 6},
        11: {key1: 2, key2: 4, key3: 6},
        12: {key1: 2, key2: 4, key3: 6},
        },
      {},
      {}
    ]
Run Code Online (Sandbox Code Playgroud)

每个对象中都有三个对象。在这三个对象中,有45个键,每个键都有一个带有三个键/值的对象。

我找不到求和每个值的好方法。

我当前的解决方案是我首先循环通过data

let count = 0;
let count2 = 0;
for(let ob of data){
     for(let child in ob[0]){
          keyOne = ob[0][child].keyOne;
          keyTwo = ob[0][child].keyTwo;
          keyThree = ob[0][child].keyThree;
          keyFour = ob[0][child].keyFour;
          if(count < 45) {
               newData[0][count].keyOne += keyOne;
               newData[0][count].keyTwo += gkeyTwop;
               newData[0][count].keyThree += keyThree;
               newData[0][count].keyFour += keyFour;
          } else {
               newData[0][count2].keyOne += keyOne;
               newData[0][count2].keyTwo += keyTwo;
               newData[0][count2].keyThree += keyThree;
               newData[0][count2].keyFour += keyFour;
               count2++;

          }
          count++;
     }
Run Code Online (Sandbox Code Playgroud)

在最坏的情况下,数据得到三个对象,每个对象具有45个键。那我必须做三遍。这似乎真的很糟糕。肯定有更好的办法。提示?

Nin*_*olz 1

添加值后,您可以使用Array#reduce并映射内部数组的值。

var data = [[{ 10: { key1: 1, key2: 2, key3: 3 }, 11: { key1: 1, key2: 2, key3: 3 }, 12: { key1: 1, key2: 2, key3: 3 }, }, {}, {}], [{ 10: { key1: 1, key2: 2, key3: 3 }, 11: { key1: 1, key2: 2, key3: 3 }, 12: { key1: 1, key2: 2, key3: 3 }, }, {}, {}]],
    result = data.reduce((a, b) => 
        a.map((v, i) =>
            (Object.keys(b[i]).forEach(k =>
                Object.keys(b[i][k]).forEach(l => 
                    v[k][l] = (v[k][l] || 0) + b[i][k][l]))
            , v)
        )
    );

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)