我正在尝试为2d数组的索引分配一个变量,然后使用此变量将其绕2d数组移动。例如,let p = grid[0][0]
,然后我希望能够将其移动到grid[1][0]
,grid[1][5]
等。但是,我返回了一个带有以下代码的未定义变量值:
const intiateGrid = (x) => {
grid = new Array(x);
for (let i = 0; i < grid.length; i++) {
grid[i] = new Array(x);
}
return grid;
}
let grid = []
intiateGrid(10);
let p = grid[0][0];
console.log(p);
答案 0 :(得分:2)
对于初学者,您永远不会将intiateGrid(10)
的结果分配给网格。应该是let grid = intiateGrid(10)
。代码还有更多问题,但是请让我更多地了解。例如,intiateGrid(number)
应该创建一个方矩阵吗?初始值应该是多少?另外,在循环遍历矩阵时,请勿对其进行变异。
const grid = intiateGrid(10);
const player = {
rowIndex: 0,
colIndex: 0
}
//player starts at [0][0]
movePlayer(0, 0)
function intiateGrid(x) {
const arr = new Array(x).fill(0); // array with x zeros
const grid = arr.map(element => new Array(x).fill('O')) // array with x arrays, each with x zeros.
return grid;
}
function movePlayer(row, col) {
grid[row][col] = 'P';
//set -1 to previous location
grid[player.rowIndex][player.colIndex] = 'X'
//update player location
player.rowIndex = row;
player.colIndex = col;
console.log(`Player is at [${player.rowIndex}][${player.colIndex}]`)
}
movePlayer(1,0);
movePlayer(1,1);
movePlayer(1,2);
movePlayer(1,3);
movePlayer(2,3);
grid.forEach(row => console.log(row.join(' | ')))
答案 1 :(得分:1)
您正在做的是创建:
[ [ <10 empty items> ],
[ <10 empty items> ],
[ <10 empty items> ],
[ <10 empty items> ],
[ <10 empty items> ],
[ <10 empty items> ],
[ <10 empty items> ],
[ <10 empty items> ],
[ <10 empty items> ],
[ <10 empty items> ] ]
您将p分配为第一个数组中的第一个空项目。因此,当然,console.log()将打印未定义的,因为您尚未分配任何值。正如其他人指出的那样,您并未在任何地方分配函数的值,因此grid[0][0]
的分配无论如何都将指向无。
您需要通过grid[0][0] = 0;
分配它们,或者与fill(number);
一起初始化所有索引
@Smytt解决方案绝对更干净,并且避免了解决方案的陷阱。使用当前的解决方案,每个函数调用都会更改可能已经修改的网格。同时,该功能不适用于您可能要创建的任何其他网格而不会覆盖当前网格,因为它只能修改网格。您可以删除let grid = [];
,而console.log(grid);
仍会向您显示该数组,如我的文章顶部所示。您正在处理仅隐式声明的副作用,这被认为是一种危险的样式。
const intiateGrid = (x) => {
grid = new Array(x);
for (let i = 0; i < grid.length; i++) {
grid[i] = new Array(x);
}
return grid;
}
intiateGrid(2);
grid[0,0] = 5;
let newGrid = intiateGrid(3);
console.log(grid);
我们在没有目标的情况下更改了网格,我们要做的就是将新网格分配给另一个变量!这就是为什么使用具有此类副作用的代码被认为是危险的。
答案 2 :(得分:0)
您的问题尚不完全清楚,但这是
例如
let p = grid[0][0]
,然后我希望能够将其移至grid [1] [0],grid [1] [5]等。
使得您似乎想为二维数组结构中的某个位置创建某种“指针”。没有真正的方法来实现简单的价值。一种方法是使用对象:
let p = { x: 0, y: 0 };
然后,您可以创建函数以使用此类对象返回网格单元格:
function getCell(pointer) {
return grid[pointer.x][pointer.y];
}
function setCell(pointer, value) {
grid[pointer.x][pointer.y] = value;
}
除了将像两个示例那样的内部函数隐藏起来之外,您最终无法避免使用两个单独的数字显式索引到二维结构中的需要。