【问题标题】:For-Loop to Generate Multi Dimensional ArrayFor-Loop 生成多维数组
【发布时间】:2025-12-06 04:40:01
【问题描述】:

提前感谢您抽出宝贵时间帮助我解决这个问题。

我正在尝试使用 for 循环生成一个像这样的简单板。

var board = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]];

但是,我在下面的尝试没有成功。

function makeBoard(n){
  var board=[];
  for(var i=0; i<n; i++){
    for(var j=0; j<n; j++){
      board[i][j]=0;
    }
  }
  return board;
}

从技术上讲,我可以只使用上面显示的 board 变量,然后继续,但我更关心原理。使用 for 循环创建多维数组是不可能的吗?有没有一种简单的方法可以使用 array.push() 来完成这个?

【问题讨论】:

    标签: javascript for-loop multidimensional-array


    【解决方案1】:

    您需要为每个新子数组初始化为array

    function makeBoard(n){
        var board=[];
        for(var i=0; i<n; i++){
            board[i] = []; // <-- this is missing!
            for(var j=0; j<n; j++){
                board[i][j]=0;
            }
        }
        return board;
    }
    document.write('<pre>' + JSON.stringify(makeBoard(5), 0, 4) + '</pre>');

    另一个没有for循环的版本

    function makeBoard(n){
        return Array.apply(null, {length: n}).map(function () {
            return Array.apply(null, {length: n}).map(function () {
                return 0;
            });
        });
    }
    document.write('<pre>' + JSON.stringify(makeBoard(5), 0, 4) + '</pre>');

    【讨论】:

      【解决方案2】:

      您生成一个数组,然后在其中循环新数组。像这样的:

      var arr = new Array(10);
      for (var i = 0; i < 10; i++) {
        arr[i] = new Array(6);
      }
      

      【讨论】:

        【解决方案3】:

        JavaScript 没有多维数组,因此您必须使用数组数组来代替:

        function makeBoard(n){
          var board=[];
          for(var i=0; i<n; i++){
            board[i] = [];
            for(var j=0; j<n; j++){
              board[i][j]=0;
            }
          }
          return board;
        }
        

        您缺少为第二维创建每个数组所需的 board[i] = [];

        注意:你也可以使用Array.prototype.fill:

        function makeBoard(n){
          var board=[];
          for(var i=0; i<n; i++){
            board[i] = Array(n).fill( 0 );
          }
          return board;
        }
        

        【讨论】:

        • 填充仅适用于selected user agents
        • @isvforall 这行不通,因为Array.fill 不做深拷贝。你最终得到board[0] === board[1] === board[2] ... 对同一个数组的所有引用