Array.from不执行深层复制

时间:2018-12-02 18:38:55

标签: 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[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);

2 个答案:

答案 0 :(得分:1)

看看像这样传播具有 ES6 阵列的复制是否会有所帮助:

let plateauBefore = [...plateau];
let plateauAfter = [...plateau];

,或者如果使用 ES6 ,则通过Array.concat

let plateauBefore = [].concat(plateau);
let plateauAfter = [].concat(plateau);

答案 1 :(得分:0)

我找到了答案here:对于数组和对象,这项工作非常完美!

//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}]