我想在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;
}
}
}
答案 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;
}
}
}
我做了三处修改:
x
和y
个更具描述性的名称cell
row
和col
(以前为x
和y
)作为索引,而不是i
和j
通过创建一个变量来保存单元格引用,您不再需要索引两次并重命名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);
我在控制台上正确获取了值。访问它究竟是什么问题?