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

时间:2019-06-19 12:57:57

标签: javascript

我正在尝试为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);  

3 个答案:

答案 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;
}

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