为什么我不能在 JS 中复制这个二维数组?我怎样才能制作副本?
Why can't I make a copy of this 2d array in JS? How can I make a copy?
我正在实施 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]);
}
}
为了响应此代码,JavaScript 打印 at (0,0) false
。我需要它保持 true
直到下一代开始。
我原以为 let oldLifeMap = lifeMap.slice()
会解决问题,但事实并非如此,我也不确定为什么。 (它不应该 复制 二维数组而不创建第二个引用吗?)
无论如何,这是怎么回事,我如何在这里成功制作 lifeMap
的实际副本?
您可以按如下方式克隆 ND(深度嵌套)数组;
Array.prototype.clone = function(){
return this.map(e => Array.isArray(e) ? e.clone() : e);
};
或者如果您不想修改 Array.prototype
,您可以简单地重构上面的代码;
function cloneArray(a){
return a.map(e => Array.isArray(e) ? cloneArray(e) : e);
};
对 的提示,这对 N 维数组很有用,但对于 2D 数组来说是不必要的。为了深入克隆您的特定二维数组,您需要做的就是:
let oldLifeMap = lifeMap.map(inner => inner.slice())
这将使用 .slice()
创建每个内部数组的副本,不带参数,并将其存储到使用 .map()
.
制作的外部数组的副本中
我正在实施 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]);
}
}
为了响应此代码,JavaScript 打印 at (0,0) false
。我需要它保持 true
直到下一代开始。
我原以为 let oldLifeMap = lifeMap.slice()
会解决问题,但事实并非如此,我也不确定为什么。 (它不应该 复制 二维数组而不创建第二个引用吗?)
无论如何,这是怎么回事,我如何在这里成功制作 lifeMap
的实际副本?
您可以按如下方式克隆 ND(深度嵌套)数组;
Array.prototype.clone = function(){
return this.map(e => Array.isArray(e) ? e.clone() : e);
};
或者如果您不想修改 Array.prototype
,您可以简单地重构上面的代码;
function cloneArray(a){
return a.map(e => Array.isArray(e) ? cloneArray(e) : e);
};
对
let oldLifeMap = lifeMap.map(inner => inner.slice())
这将使用 .slice()
创建每个内部数组的副本,不带参数,并将其存储到使用 .map()
.