替换2d数组中的特定值

xhv8bpkk  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(426)

新手!我正在通过一个2d数组生成一个棋盘,并尝试替换由“白皇后”和“黑皇后”坐标指定的数组值,现在只是让白皇后工作。
下面我想将0替换为1,其中whitequeen[0,5]是,但是循环将整个列替换为1,而不仅仅是指定的j。我想知道我哪里做错了,是否有一种不涉及循环的可能更简单的方法。
我的代码:

function generatedBoard (whiteQueen, blackQueen) {

let mainArr = new Array(8).fill([0, 0, 0, 0, 0, 0, 0, 0])

  for (i = 0; i < mainArr.length; i++) {
    for (j = 0; j < mainArr[i].length; j++) {
      if (i === whiteQueen[0] && j === whiteQueen[1]) {
        mainArr[i].splice(j, 1, "1")
      }    
    }
  }
  return mainArr
}

let whiteQueen = [0, 5];
let blackQueen = [5, 0];

console.log(generatedBoard(whiteQueen, blackQueen));

Result: 

[ [ 0, 0, 0, 0, 0, '1', 0, 0 ],
  [ 0, 0, 0, 0, 0, '1', 0, 0 ],
  [ 0, 0, 0, 0, 0, '1', 0, 0 ],
  [ 0, 0, 0, 0, 0, '1', 0, 0 ],
  [ 0, 0, 0, 0, 0, '1', 0, 0 ],
  [ 0, 0, 0, 0, 0, '1', 0, 0 ],
  [ 0, 0, 0, 0, 0, '1', 0, 0 ],
  [ 0, 0, 0, 0, 0, '1', 0, 0 ] ]
eivnm1vs

eivnm1vs1#

mainArr 数组是使用 fill 方法,, new Array(8).fill([0, 0, 0, 0, 0, 0, 0, 0]) ,在新创建的数组中,所有元素( [0, 0, 0, 0, 0, 0, 0, 0] )在内存中引用到相同的值。
因此,当您尝试更新数组中的一个值时,因为所有数组都是链接的,所以所有数组中的值都会更改。
要创建一个没有这样链接的数组,可以使用循环手动创建,如下所示:

const mainArr = [];

for (let i = 0; i < 8; i++) {
  const row = [];
  for (let i = 0; i < 8; i++) row.push(0);
  mainArr.push(row);
}

对于更新,您可以更轻松地执行以下操作:

mainArr[whiteQueen[0]][whiteQueen[1]] = 1;
mainArr[blackQueen[0]][blackQueen[1]] = 1;

上述代码将用替换精确值 1 .
最终代码:

function generatedBoard(whiteQueen, blackQueen) {
  const mainArr = [];

  for (let i = 0; i < 8; i++) {
    const row = [];
    for (let i = 0; i < 8; i++) row.push(0);
    mainArr.push(row);
  }

  mainArr[whiteQueen[0]][whiteQueen[1]] = 1;
  mainArr[blackQueen[0]][blackQueen[1]] = 1;

  return mainArr;
}

let whiteQueen = [0, 5];
let blackQueen = [5, 0];

console.log(generatedBoard(whiteQueen, blackQueen));
jutyujz0

jutyujz02#

下一行创建一个数组,每个元素引用同一个数组,即。 [0, 0, 0, 0, 0, 0, 0, 0] .

let mainArr = new Array(8).fill([0, 0, 0, 0, 0, 0, 0, 0])

更改任何元素 mainArr 将改变它的所有元素。
你什么时候使用 Array.prototype.fill() 方法,则必须使用静态值。

相关问题