为什么我不能在JS中复制这个2d数组?我怎样才能复制?

And*_*orn 1 javascript arrays copy multidimensional-array conways-game-of-life

我正在实施John Conway生命游戏,但我遇到了一个奇怪的问题.如果代码给我带来麻烦,这是一个简短的版本:

let lifeMap = [
  [true, false, false],
  [false, false, false],
  [false, false, false]
];
let oldLifeMap = lifeMap.slice();
for (let row = 0; row < lifeMap.length; row++) {
  for (let val = 0; val < lifeMap[row].length; val++) {
    let bool = lifeMap[row][val];
    let newBool = false; // here is where I would determine if cell is alive/dead
    lifeMap[row][val] = newBool;
    if (row === 0 && val === 0) console.log("at (0,0)", oldLifeMap[0][0]);
  }
}
Run Code Online (Sandbox Code Playgroud)

为了响应此代码,JavaScript打印at (0,0) false.我需要它一直true持续到下一代开始.

我以为做let oldLifeMap = lifeMap.slice()会解决它,但事实并非如此,我不确定为什么.(它不应该复制 2d数组而不是创建第二个引用吗?)

无论如何,这里发生了什么,我如何成功地制作lifeMap这里的实际副本?

Pat*_*rts 6

对于@Dia的答案来说,这是一个很好的解决方案,它对于N维数组很有用,但对于2D数组而言,这是不必要的.为了深入克隆您的特定2D阵列,您需要做的就是:

let oldLifeMap = lifeMap.map(inner => inner.slice())
Run Code Online (Sandbox Code Playgroud)

这将使用.slice()不带参数的每个内部数组的副本创建,并将其存储到使用的外部数组的副本.map().


Red*_*edu 5

You may clone an ND (deeply nested) array as follows;

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};
Run Code Online (Sandbox Code Playgroud)

or if you don't want to modify Array.prototype you may simply refactor the above code like;

function cloneArray(a){
  return a.map(e => Array.isArray(e) ? cloneArray(e) : e);
};
Run Code Online (Sandbox Code Playgroud)