Javascript 为什么可以';我不能用JS复制这个2d数组吗?我怎样才能复印?
我正在实施约翰·康威的人生游戏,但我遇到了一个奇怪的问题。如果代码给我带来麻烦,下面是一个简短的版本:Javascript 为什么可以';我不能用JS复制这个2d数组吗?我怎样才能复印?,javascript,arrays,multidimensional-array,copy,conways-game-of-life,Javascript,Arrays,Multidimensional Array,Copy,Conways Game Of Life,我正在实施约翰·康威的人生游戏,但我遇到了一个奇怪的问题。如果代码给我带来麻烦,下面是一个简短的版本: 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;
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]);
}
}
let lifeMap=[
[真,假,假],
[假,假,假],
[假,假,假]
];
让oldLifeMap=lifeMap.slice();
for(让row=0;row
作为对该代码的响应,JavaScript在(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()
创建的外部数组的副本外部数组是一个副本,但每个内部数组仍然是一个引用。这是你所做的预期行为。明白了。那么我该如何制作深度拷贝呢?.map(a=>a.slice())
可能重复var copy=JSON.parse(JSON.stringify(lifeMap))
有趣的提议,但在我看来对于2D数组来说太过通用了,它不需要递归函数。@Patrick RobertsArray.prototype
上面的扩展只是为了说明该算法。当然,这必须由Object.defineProperty()
完成。大家一致认为,最好将其实现为静态Array.clone()
。