JavaScript中的二维结构数组

时间:2015-03-22 06:35:05

标签: javascript arrays

我想在javascript中创建二维数组,其中每个单元格都是具有属性的结构。如何访问单元结构的属性?

这是我的代码:

// function to create cell objects
function cell () {
  return {
    "value" : 0,
    "open" : 0,
    "mine" : false
  };
};

// initialise all cells
var game = new Array(10);

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

  for(var j = 0 ; j < 10; j++){
   game[i][j] = cell();
  }
}

如何访问属性?

我尝试过不同的命令,但我得到了未定义的属性。

game[0][0]["mine"] = true;
game[0][0].mine = true;

感谢。

----更新---- 我收到此错误

TypeError: Cannot set property 'mine' of undefined (line 38)

这是我的确切代码

// Minesweeper game

// ask user to the size of game
var rows = Number(prompt("Please enter number of rows", "10"));
var cols = Number(prompt("Please enter number of columns", "10"));

// calculate number of mines
var mines = Math.floor(rows*cols*0.2);

// function to create cell objects
function cell (value, open) {
    return {
      "value" : value,
      "open" : open,
      "mine" : false
    };
};

// initialise all cells
var game = new Array(rows);

for(var i = 0 ; i < rows ; i++){
  game[i] = new Array(cols);

  for(var j = 0 ; j < cols ; j++){
    game[i][j] = cell(0, false);
  }
}

// place mines randomly
for(var i = 0 ; i < mines ; i++){
  var placedMine = false;
  while(!placedMine){
    var x = Math.floor((Math.random()*rows)); 
    var y = Math.floor((Math.random()*cols));

    if( game[i][j].mine === false){
      game[i][j].mine = true;
      placedMine = true;
    }
  }

}

2 个答案:

答案 0 :(得分:0)

问题不在于数组本身,而在于代码中的最后一个if语句

  if( game[i][j].mine === false){
    game[i][j].mine = true;
    placedMine = true;
  }

j之前已定义并用于for循环。当j等于cols并且j保持值(cols的值)时,for循环退出,因此if语句中的条件等于

  if( game[0][cols].mine === false){
     ...
  }

并且由于您从未向game[0][cols]分配任何内容,因此表达式(game[0][cols])未定义且没有名为mine的属性

你也有一个功能性错误。您在最后一个for循环中使用i作为矿山的计数器以及行号。我认为你真正想做的是这个

// place mines randomly
for(var i = 0 ; i < mines ; i++){
  var placedMine = false;
  while(!placedMine){
    var row = Math.floor((Math.random()*rows)),
        col = Math.floor((Math.random()*cols)),
        cell = game[row][cell];

    if(cell.mine === false){
      cell.mine = true;
      placedMine = true;
    }
  }
}

我做了三处修改:

  1. 我已经提供了xy个更具描述性的名称
  2. 我宣布了一个名为cell
  3. 的新变量
  4. 我使用rowcol(以前为xy)作为索引,而不是ij
  5. 通过创建一个变量来保存单元格引用,您不再需要索引两次并重命名x和y使代码更容易阅读(特别是因为x通常是水平值,也就是列号,y通常是垂直值)

答案 1 :(得分:-1)

更新:我不知道为什么我的答案被低估了,因为这是在OP发布更新之前发布的,但无论如何。

我刚刚这样做了:

            // function to create cell objects
            function cell() {
                return {
                    "value": 0,
                        "open": 0,
                        "mine": false
                };
            };

            // initialise all cells
            var game = new Array(10);

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

                for (var j = 0; j < 10; j++) {
                    game[i][j] = cell();
                }
            }
            console.log(game[0][0].mine);

我在控制台上正确获取了值。访问它究竟是什么问题?