【问题标题】:How to create a 2d array of zeroes in javascript?如何在javascript中创建一个二维零数组?
【发布时间】:2011-04-11 00:48:33
【问题描述】:

有没有一种简单的方法可以在 javascript 中以编程方式创建二维数组?

我不想要的:

var array2D = [ 
  [0,0,0],
  [0,0,0],
  [0,0,0]
]

【问题讨论】:

    标签: javascript multidimensional-array


    【解决方案1】:

    好吧,你可以写一个辅助函数:

    function zeros(dimensions) {
        var array = [];
    
        for (var i = 0; i < dimensions[0]; ++i) {
            array.push(dimensions.length == 1 ? 0 : zeros(dimensions.slice(1)));
        }
    
        return array;
    }
    
    > zeros([5, 3]);
      [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
    

    奖励:处理任意数量的维度。

    【讨论】:

    • item 更改为作为项目工厂的 lambda。
    • 这可以写得更清楚。通常,当您编写递归函数时,您应该确保基本情况和归纳情况很容易识别。在上面的代码中,两者都在同一行——非常混乱。相反,我建议您检查函数顶部的 dimensions.length === 1 条件,并创建两个 for 循环——一个创建一个 0 数组(基本情况),一个创建一个带有 @ 的数组987654325@ 函数调用(归纳案例)。虽然生成的代码会更冗长,但它的混乱程度要小得多。
    【解决方案2】:
    function zero2D(rows, cols) {
      var array = [], row = [];
      while (cols--) row.push(0);
      while (rows--) array.push(row.slice());
      return array;
    }
    

    【讨论】:

      【解决方案3】:

      2017 年解决方案:

      迟到了,但这篇博文仍然在 Google 搜索结果中排名靠前。

      创建一个给定大小的二维数组(适应更多维度):

      let array = Array(rows).fill().map(() => Array(columns));
      

      预填充二维数组:

      let array = Array(rows).fill().map(() => Array(columns).fill(0));
      

      例如:

      Array(2).fill().map(() => Array(3).fill(42));
      // Result:
      // [[42, 42, 42],
      //  [42, 42, 42]]
      

      警告:

      Array(rows).fill(Array(columns)) 将导致所有行都引用同一个数组!!


      2018 年 9 月 24 日更新(感谢 @Tyler):

      另一种可能的方法是使用Array.fill() 来应用地图功能。

      例如:

      Array.from(Array(2), _ => Array(3).fill(43));
      // Result:
      // [[43, 43, 43],
      //  [43, 43, 43]]
      

      基准测试:

      https://jsperf.com/multi-dimensional-array-map-vs-fill/5

      【讨论】:

      • 不错的答案。使用 Array.from({ length: rows }, () =&gt; Array(columns).fill(value)); 而不是 Array.from(Array(rows), _ =&gt; Array(columns).fill(value)); 可以避免创建空数组。但我不确定哪个更快。
      • Richard Natal 很好地为我更新了 jsperf 测试,所以我将只更新 jsperf 链接。对我来说,[...Array(1000)].map(e =&gt; Array(1000).fill(0)); 方法是最快的,紧随其后的是 for 循环变体。
      【解决方案4】:

      您可以使用以下函数来创建 2D 零数组

      const zeros = (m, n) => [...Array(m)].map(e => Array(n).fill(0));
      
      console.log(zeros(3, 4));
      
      // [ [ 0, 0, 0, 0 ],
      //   [ 0, 0, 0, 0 ],
      //   [ 0, 0, 0, 0 ] ]

      【讨论】:

        【解决方案5】:

        简单易懂的初学者方法:

        function twoDarrMaker(row, col) {
          const twoDarr = [];
        
          for (let i = 0; i < row; i++) {
            let subarray = [];
        
            for (let j = 0; j < col; j++) {
              subarray.push(0);
            }
        
            twoDarr.push(subarray);
          }
        
          return twoDarr;
        }
        
        twoDarrMaker(3, 2);
        // [
        //   [ 0, 0 ],
        //   [ 0, 0 ],
        //   [ 0, 0 ]
        // ]
        

        编辑:这是我的代码的解释。您创建一个数组twoDArr 来保存二维数组或数组数组。您使用外部 for 循环来创建子数组。然后使用内部 for 循环向子数组添加零。然后将子数组添加到外部数组twoDarr。然后,无论外部 for 循环指定多少次,都重复该过程。当外部 for 循环完成后,返回二维数组。

        基本上,外部 for 循环创建行(子数组),而内部 for 循环创建列(子数组中的元素)。外部 for 循环告诉您通过重复块中的代码 x 次来创建 x 行(子数组),内部 for 循环告诉您通过重复块中的代码来创建 y 列(元素) y次。

        【讨论】:

        • 请不要在没有解释的情况下发布代码作为答案。试着解释你的代码做了什么以及它是如何解决问题的。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 2015-01-13
        • 2013-05-06
        • 1970-01-01
        • 2019-04-29
        • 1970-01-01
        相关资源
        最近更新 更多