【问题标题】:Javascript sum inner arrays in 3d nested arraysJavascript对3d嵌套数组中的内部数组求和
【发布时间】:2020-09-25 19:39:10
【问题描述】:

我有一个 3d 数组,第一级数组可以有一个到多个项目(数组)。每个内部数组都有一个固定长度,它的元素也是固定长度的数组。在下面的示例中,长度分别为 3 和 3。我想对各自的内部数组求和,[1+1+1, 2+2+2, 3+3+3]。输出应该是一个 3 x 3 形状的二维数组。

let arr = [
  [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
  [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
  [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
];

//expected output = [[3,6,9],[12,15,18],[21,24,27]]  

我尝试了很多方法,但我能得到最好的:

let arr = [
  [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
  [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
  [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
];
let data = [];

arr.forEach((e) => {
  data.push(e.reduce((r, a, i) => a.map((b, j) => r[j] + b)));
})

// returns [[12, 15, 18], [12, 15, 18], [12, 15, 18]]
console.log(data);

但这是[1+4+7, 2+5+8, 3+6+9]的总和。

【问题讨论】:

    标签: javascript arrays multidimensional-array


    【解决方案1】:

    您可以减少外部数组,因为此维度映射到二维数组的值。

    let array = [[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]],
        sum = array.reduce((a, b) => b.map((x, i) => x.map((v, j) => a[i][j] + v)));
    
    console.log(sum); // [[3, 6, 9], [12, 15, 18], [21, 24, 27]]
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 我在一个对象的方法中实现了这段代码,但它不起作用,它不会抛出任何错误,但它在第一次迭代后返回一个空数组。我将其作为具有相同数据的独立操作进行了测试,并且运行良好。我添加了一个空数组作为“初始值”,它通过两次迭代、停止和静止返回一个空数组。我想不通。
    • 您对阵列的访问可能不起作用。你能添加你的实现吗?
    • 我会将其添加为新问题。
    • 这里是新问题的链接。 stackoverflow.com/questions/62237704/…
    【解决方案2】:

    你可以使用一个简单的for循环

    let arr = [
      [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
      ],
      [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
      ],
      [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
      ],
    ];
    
    let final = [[],[],[]]
    
    for(let i=0; i<arr[0].length; i++){
      for(let j=0; j<arr[0][i].length; j++){
         for(let k=0; k<arr[0][j].length; k++){
          final[i][j] = (final[i][j]||0)+arr[k][i][j]
        }
      }
    }
    
    console.log(final)

    【讨论】:

      【解决方案3】:

      首先创建具有 0 个值的空输出数组。 使用嵌套的 forEach 循环并填充输出值。

      let arr = [
        [
          [1, 2, 3],
          [4, 5, 6],
          [7, 8, 9],
        ],
        [
          [1, 2, 3],
          [4, 5, 6],
          [7, 8, 9],
        ],
        [
          [1, 2, 3],
          [4, 5, 6],
          [7, 8, 9],
        ],
      ];
      
      const output = Array.from({ length: arr[0].length }, () =>
        new Array(arr[0][0].length).fill(0)
      );
      
      arr.forEach((array) =>
        array.forEach((rows, row) =>
          rows.forEach((val, col) => (output[row][col] += val))
        )
      );
      
      console.log(output);

      【讨论】:

        【解决方案4】:

        顶级数组的长度可以不同的解决方案——因此它可能有 4 或 5 个网格,从而导致 4 或 5 个值的总和:

        let arr = [[[1, 2, 3],[4, 5, 6],[7, 8, 9]],[[1, 2, 3],[4, 5, 6],[7, 8, 9]],[[1, 2, 3], [4, 5, 6],[7, 8, 9]],];
        
        let data = arr[0].map((row, i) =>
          row.map((_, j) => arr.reduce((sum, sub) => sum + sub[i][j]))
        );
        
        console.log(data);

        【讨论】:

          猜你喜欢
          • 2021-03-29
          • 1970-01-01
          • 1970-01-01
          • 2018-11-30
          • 2015-06-12
          • 2016-10-24
          • 2021-08-09
          • 1970-01-01
          • 2018-08-28
          相关资源
          最近更新 更多