Javascript Array.com无法执行深度复制
我想做一个战舰游戏。我到处找了找,经过大约10个小时的研究,还是没能弄明白 问题是,即使我尝试使用Javascript Array.com无法执行深度复制,javascript,arrays,copy,Javascript,Arrays,Copy,我想做一个战舰游戏。我到处找了找,经过大约10个小时的研究,还是没能弄明白 问题是,即使我尝试使用Array.from进行深度复制,更改plateauAfter数组也会更改plateauBefore数组 //function which make a two-dimensional array function plateau() { let plateau = new Array(); for (let i = 0; i < 10; i++) { plateau[
Array.from
进行深度复制,更改plateauAfter
数组也会更改plateauBefore
数组
//function which make a two-dimensional array
function plateau() {
let plateau = new Array();
for (let i = 0; i < 10; i++) {
plateau[i] = new Array();
for (let j = 0; j < 10; j++) {
plateau[i][j] = '[]';enter code here
}
}
return plateau;
}
let CPU = {
navire: [
{
PorteAvion: 5,
Position: ['B', 3],
Direction: 'bas',
Symbol: '[P]'
},
{
SousMarin: 4,
Position: ['D', 1],
Direction: 'droite',
Symbol: '[S]'
},
{
Fregate: 3,
Position: ['E', 4],
Direction: 'gauche',
Symbol: '[F]'
}
]
}
function placementBateau(plateau, typeNavire, position, direction, symbol) {
let plateauBefore = Array.from(plateau);
let plateauAfter = Array.from(plateau);
let letter = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'];
let row = position[1] - 1;
let column = letter.indexOf(position[0]);
for (i = 0; i < typeNavire; i++) {
if (-1 in plateauAfter[row]) {
console.log('Le navire dépasse du plateau ! recommancer svp');
return plateauBefore;
} else {
switch (direction) {
case 'haut':
try {
plateauAfter[row - i][column] = symbol;
break;
} catch (error) {
console.log('Le navire dépasse du plateau ! recommancer svp');
return plateauBefore;
}
case 'bas':
try {
plateauAfter[row + i][column] = symbol;
break;
} catch (error) {
console.log('Le navire dépasse du plateau ! recommancer svp');
return plateauBefore;
}
case 'gauche':
try {
plateauAfter[row][column - i] = symbol;
break;
} catch (error) {
console.log('Le navire dépasse du plateau ! recommancer svp');
return plateauBefore;
}
case 'droite':
try {
plateauAfter[row][column + i] = symbol;
break;
} catch (error) {
console.log('Le navire dépasse du plateau ! recommancer svp');
return plateauBefore;
}
};
}
}
return plateauAfter;
}
let plateauCPU = plateau();
plateauCPU = placementBateau(plateauCPU, CPU.navire[0].PorteAvion, CPU.navire[0].Position, CPU.navire[0].Direction, CPU.navire[0].Symbol);
plateauCPU = placementBateau(plateauCPU, CPU.navire[1].SousMarin, CPU.navire[1].Position, CPU.navire[1].Direction, CPU.navire[1].Symbol);
plateauCPU = placementBateau(plateauCPU, CPU.navire[2].Fregate, CPU.navire[2].Position, CPU.navire[2].Direction, CPU.navire[2].Symbol);
console.log(plateauCPU);
//构成二维数组的函数
功能平台(){
设plateau=newarray();
for(设i=0;i<10;i++){
平台[i]=新数组();
for(设j=0;j<10;j++){
平台[i][j]='[]';在此处输入代码
}
}
回归高原;
}
让CPU={
纳维:[
{
波特维翁:5,
位置:[B',3],
方向:“bas”,
符号:“[P]”
},
{
苏斯马林:4,
位置:[D',1],
方向:“droite”,
符号:“[S]”
},
{
弗雷盖特:3,
位置:[E',4],
方向:“笨拙”,
符号:“[F]”
}
]
}
功能位置BATEAU(平台、类型导航、位置、方向、符号){
let plateauBefore=Array.from(平台);
let plateauAfter=Array.from(平台);
让字母=['A','B','C','D','E','F','G','H','I','J','K'];
设行=位置[1]-1;
设column=letter.indexOf(位置[0]);
对于(i=0;i
查看这样使用ES6阵列排列进行复制是否有帮助:
let plateauBefore = [...plateau];
let plateauAfter = [...plateau];
或者,如果使用ES6存在问题,则通过:
let plateauBefore = [].concat(plateau);
let plateauAfter = [].concat(plateau);
我找到了答案:这项工作非常完美,适合数组和对象
//Deep Clone
let a = [{ x:{z:1} , y: 2}];
let b = JSON.parse(JSON.stringify(a));
b[0].x.z=0
console.log(JSON.stringify(a)); //[{"x":{"z":1},"y":2}]
console.log(JSON.stringify(b)); // [{"x":{"z":0},"y":2}]
谢谢兄弟的帮助,但我终于找到了解决办法: