【问题标题】:Computing sum of a 2D array in JavaScript在 JavaScript 中计算二维数组的总和
【发布时间】:2021-03-27 23:04:39
【问题描述】:

我正在尝试解决一个简单的问题:给定一个二维整数数组(由整数组成的数组组成的数组)计算整数的总和。
例如,给定这个二维数组:

[
[1, 0, 0],
[1, 1, 0],
[1, 1, 1]
]

输出将是6

这是我尝试过的:

const array = [
[1, 0, 0],
[1, 1, 0],
[1, 1, 1]
]

const twoDsum = a => a.reduce( (r,x) => r + x.reduce( (s,y) => s + y) );

console.log(twoDsum(array));

如你所见,我得到了三个整数,这对我来说是无稽之谈。

我还尝试了以下代码来弄清楚发生了什么,但我不明白

const array = [
[1, 0, 0],
[1, 1, 0],
[1, 1, 1]
]

// this function works as you can see from the logs
const sum = a => a.reduce( (r,x) => r + x );

for(let i = 0; i < array.length; i++) {

    console.log(sum(array[i]));
}

// I don't get why this doesn't
const twoDsum = a => a.reduce( (r,x) => r + sum(x) );

console.log(twoDsum(array));

【问题讨论】:

  • a.reduce( (r,x) =&gt; r + sum(x) ) 缺少初始值0,因此使用[1, 0, 0]。因此,第一次迭代执行[1, 0, 0] + sum([1, 1, 0]),产生一个字符串。阅读documentation。我建议始终提供一个初始值。

标签: javascript multidimensional-array reduce


【解决方案1】:

确保您将initialValue(第二个位置参数)明确地提供为0,以使总和起作用。否则将使用第一个元素,即[1,0,0],将转换为字符串1,0,0

用作回调第一次调用的第一个参数的值。如果没有提供初始值,则数组中的第一个元素将用作初始累加器值

在此处查看工作示例:

const array = [
  [1, 0, 0],
  [1, 1, 0],
  [1, 1, 1]
]

const twoDsum = a => a.reduce((r, x) => r + x.reduce((s, y) => s + y, 0), 0);

console.log(twoDsum(array));

【讨论】:

  • 哦,我以为初始值应该是0,谢谢你的解释。
【解决方案2】:

如果你只是想得到总和,那么为什么不先展平数组呢?

const arr = [
  [1, 0, 0],
  [1, 1, 0],
  [1, 1, 1]
]

const flatArr = arr.flat()

flatArr 现在应该是 [1, 0, 0, 1, 1, 0, 1, 1, 1]

您现在应该可以使用您希望使用的普通 reduce

const sum = flatArr.reduce((acc, value) =>  acc += value, 0); 

sum 现在应该是 6

【讨论】:

    【解决方案3】:

    我是老派,所以我只想写几个循环。超级容易编码,第一次工作,无需调试,我认为这是最容易理解的解决方案:

    const twoDsum = matrix => {
        let sum = 0;
        for( const row of matrix ) {
            for( const cell of row ) {
                sum += cell;
            }
        }
        return sum;
    };
    
    console.log(
        twoDsum(
            [
                [ 1, 0, 0 ],
                [ 1, 1, 0 ],
                [ 1, 1, 1 ]
            ]
        )
    );

    【讨论】:

      【解决方案4】:

      使用Array.prototype.forEach()

      const array = [
        [1, 0, 0],
        [1, 1, 0],
        [1, 1, 1],
      ];
      
      const twoDsum = (a) => {
        let total = 0;
        a.forEach(arr => {
          arr.forEach(num => {
            total += num;
          });
        });
        return total
      };
      
      console.log(twoDsum(array));

      【讨论】:

        【解决方案5】:

        您可以改用.flat() 并使用原始方程。

        const array = [
        [1, 0, 0],
        [1, 1, 0],
        [1, 1, 1]
        ]
        
        // this function works as you can see from the logs
        const sum = a => a.reduce( (r,x) => r + x );
        
        for(let i = 0; i < array.length; i++) {
        
            console.log(sum(array[i]));
        }
        
        // I don't get why this doesn't
        const twoDsum = a => a.flat().reduce( (r,x) => r + x );
        
        console.log(twoDsum(array));

        【讨论】:

          【解决方案6】:

          我建议不要做两次reduce,而是先使用flat方法:

          const array = [
          [1, 0, 0],
          [1, 1, 0],
          [1, 1, 1]
          ]
          
          const twoDsum = a => a.flat().reduce((acc,val) => acc + val);
          
          console.log(twoDsum(array));

          【讨论】:

            【解决方案7】:

            您可以采用递归方法并检查项目是否为数组。

            const
               addArray = (s, v) => s + (Array.isArray(v) ? v.reduce(addArray, 0) : v),
               data = [[1, 0, 0], [1, 1, 0], [1, 1, 1]],
               sum = data.reduce(addArray, 0);
            
            console.log(sum);

            【讨论】:

              猜你喜欢
              • 2012-07-23
              • 2019-12-11
              • 1970-01-01
              • 2021-12-23
              • 1970-01-01
              • 2019-05-16
              • 2017-07-16
              • 2018-08-30
              • 1970-01-01
              相关资源
              最近更新 更多