繁体   English   中英

将变量分配给二维数组的索引

[英]Assigning a variable to an index of a 2d array

我试图将一个变量分配给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);  

对于初学者,您永远不要将intiateGrid(10)的结果分配给grid。 应该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(' | '))) 

您正在做的是创建:

[ [ <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;来分配它们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); 

我们没有以目标为目标就更改了网格,我们要做的就是将新网格分配给另一个变量! 这就是为什么使用具有此类副作用的代码被视为危险的原因。

您的问题尚不完全清楚,但这是:

例如, 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;
}

除了像这两个示例那样在函数内部隐藏之外,您最终无法避免使用两个单独的数字显式索引到二维结构中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM