【问题标题】:Replacing specific value in a 2D array替换二维数组中的特定值
【发布时间】:2021-09-20 23:02:57
【问题描述】:

新手!我正在通过 2D 数组生成棋盘并尝试替换由“白皇后”和“黑皇后”坐标指定的数组值,现在正致力于让白皇后工作。

下面我想将 0 替换为 whiteQueen[0, 5] 所在的 1,但循环将整个列替换为 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 ] ]

【问题讨论】:

    标签: javascript loops multidimensional-array


    【解决方案1】:

    当使用fill 方法new Array(8).fill([0, 0, 0, 0, 0, 0, 0, 0]) 创建mainArr 数组时,在新创建的数组中,所有元素([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));

    【讨论】:

      【解决方案2】:

      下一行是创建一个数组,每个元素都引用同一个数组,即[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()方法时,必须使用静态值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 2013-11-25
        相关资源
        最近更新 更多