【问题标题】:Javascript pushing values into multidimensional array with for loopJavascript使用for循环将值推入多维数组
【发布时间】:2015-10-24 17:42:14
【问题描述】:

我是 Javascript 新手,正在尝试为课程组合棋盘。我必须用黑色和红色的棋子设置棋盘(即前三行是红色的,最后三行是黑色的,其他每个瓷砖都有一个棋子),我有点卡住了。我尝试了下面的代码,这只会导致数组中var checkers 的每个值都打印为null,然后是四个'B's。我想我需要以某种方式将数组的多维性合并到我的 for 循环中,但我不知道该怎么做。非常感谢任何指导或帮助!

var checkerboard = [[null,null,null,null,null,null,null,null],
                    [null,null,null,null,null,null,null,null],
                    [null,null,null,null,null,null,null,null],
                    [null,null,null,null,null,null,null,null],
                    [null,null,null,null,null,null,null,null],
                    [null,null,null,null,null,null,null,null],
                    [null,null,null,null,null,null,null,null],
                    [null,null,null,null,null,null,null,null]];


function setUpRed(square) {
    return (square = 'R');
}

for (var i = 0; i < checkerboard [3][7]; i += 2 ) {
    checkerboard.push(setUpRed(checkerboard[i]));
}

function setUpBlack(square) {
    return (square = 'B');
}

for (var i = (checkerboard.length - 1); i > checkerboard [6][0]; i -= 2) {
    checkerboard.push(setUpBlack(checkerboard[i]));
}

console.log(checkerboard);

【问题讨论】:

    标签: javascript arrays multidimensional-array nested


    【解决方案1】:

    以下代码将正确设置两个播放器,并为每个播放器计算中间行的偏移量。

    http://repl.it/agR/3344

    var checkerboard = [[null,null,null,null,null,null,null,null],
                        [null,null,null,null,null,null,null,null],
                        [null,null,null,null,null,null,null,null],
                        [null,null,null,null,null,null,null,null],
                        [null,null,null,null,null,null,null,null],
                        [null,null,null,null,null,null,null,null],
                        [null,null,null,null,null,null,null,null],
                        [null,null,null,null,null,null,null,null]];
    
    function setSquare(player, row, col) {
        checkerboard[row][col] = player;
    }
    
    function getPieceAt(row, col) {
        console.log(checkerboard[row][col] || 'null');
    }
    
    function clearBoard() {
        for (i = 0; i < checkerboard.length; i++) {
            checkerboard[i][i] = null;
        }
    }
    
    function setUpRed() {
        for (row = 0; row < 3; row++) {
            if ((row === 0) || (row === 2)) {
                for (col = 0; col < checkerboard[row].length; col += 2) {
                checkerboard[row][col] = "R";   
                }
            }
            else {
                for (col = 1; col < checkerboard[row].length; col += 2) {
                checkerboard[row][col] = "R";
                }
            }
        }
    }
    
    function setUpBlack() {
        for (row = 5; row < 8; row++) {
            if ((row === 5) || (row === 7)) {
                for (col = 1; col < checkerboard[row].length; col += 2) {
                checkerboard[row][col] = "B";   
                }
            }
            else {
                for (col = 0; col < checkerboard[row].length; col += 2) {
                checkerboard[row][col] = "B";
                }
            }
        }
    }
    
    setUpRed();
    
    setUpBlack();
    
    console.log(checkerboard);
    

    【讨论】:

    • 您解释您更改了什么以及为什么更改对 OP 很有用?也许可以解释他在哪里弄错了..
    【解决方案2】:

    这是你要找的吗?

    for(var i = 0; i < 3; i++){
     for(var j = 0; j < row.length; j++){
       checkerboard[i][j] = "RED"
     }  
    }
    
    for(var i = allrows - 3; i < 3; i++){
     for(var j = 0; j < row.length; j++){
       checkerboard[i][j] = "BLACK"
     }  
    }
    

    如果您已经定义了棋盘格,则不应推送项目..

    【讨论】:

      【解决方案3】:

      首先,你的“for”条件是错误的。

      在第一个循环中,您测试是否 i

      在第二个循环中,您测试 if i > checkerboard [6][0]。换句话说,您正在测试 i > null (与 i > 0 相同)。此外,您使用 i = (checkerboard.length - 1) 对其进行初始化,这意味着矩阵的最后 (长度是指包含行的顶级数组)。考虑到您每次迭代将 i 减 2,您将在这里迭代 4 次。

      其次,您将值推送到已填充的数组中。这将添加元素而不是覆盖您想要的位置。对于覆盖,您必须通过索引直接写入所需位置(行和列,2 维)。

      所以,解决办法是:

      for(var i = 0; i < 3; i++){
       for(var j = 0; j < checkerboard[i].length; j+=2){
         checkerboard[i][j] = "R";
       }  
      }
      
      for(var i = checkerboard.length - 1; i > checkerboard.length - 3; i--){
       for(var j = 0; j < checkerboard[i].length; j+=2){
         checkerboard[i][j] = "B";
       }  
      }
      

      这只是您的代码的初始修复。您还需要在交替行中移动起始位置才能获得正确的板。

      【讨论】:

      • 非常感谢。你的解释很有道理。我正在尝试您提供的代码,并将对其进行一些尝试。整理好后我会更新。再次感谢!
      【解决方案4】:
      var checkerboard = [[null,null,null,null,null,null,null,null],
                          [null,null,null,null,null,null,null,null],
                          [null,null,null,null,null,null,null,null],
                          [null,null,null,null,null,null,null,null],
                          [null,null,null,null,null,null,null,null],
                          [null,null,null,null,null,null,null,null],
                          [null,null,null,null,null,null,null,null],
                          [null,null,null,null,null,null,null,null]];
      
      
      for(var i = 0; i < 3; i++){
        for(var j = 0; j < 8; j+=2){
          if (i % 2) checkerboard[i][j] = "R";
          else checkerboard[i][j+1] = "R";
        }  
      }
      
      for(var i = checkerboard.length - 3; i < checkerboard.length ; i++){
        for(var j = 0; j < 8; j+=2){
          if (i%2) checkerboard[i][j] = "B";
          else checkerboard[i][j+1] = "B";
        }  
      }
      
      console.log(checkerboard);
      

      我假设您希望它看起来像使用棋盘格的常规棋盘格。这就是你要做的。

      【讨论】:

      • 感谢@eddyjs,您的代码运行良好。看到它写出来是有道理的,但我不确定如何索引多维数组。再次感谢。
      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2012-04-18
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多