在类原型函数中复制javascript数组

Copying a javascript array inside a class protoype function

本问题已经有最佳答案,请猛点这里访问。

我在javascript上有这个类:

1
2
3
4
5
6
7
8
9
10
function Node(board,x,y,t){
    this.board = board;
    this.x = x;
    this.y = y;
    this.playerTile = t;
    this.oponentTile = getOponentTile(this.playerTile);
    this.parent = null;
    this.getChildren = getChildren;

};

我用的是这个函数,它使用slice()this.board变量(数组)复制到tempBoard变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var getChildren = function() {
        if(this.x==-1 && this.y ==-1){
            var moves = getAllValidMoves(this.board,this.playerTile);
        }
        else{
            var tempBoard = this.board.slice();
            makeMove(tempBoard,this.playerTile,this.x,this.y);
            var moves = getAllValidMoves(tempBoard,this.playerTile);
        }

        var children = [];
        for(var i = 0;i<moves.length;i++){
            var currentMove = moves[i];
            var currentBoard = this.board.slice();
            if(this.x==-1 && this.y ==-1){
                children.push(new Node(currentBoard,currentMove[0],currentMove[1],this.playerTile));
            }
            else{
                makeMove(currentBoard,this.playerTile,this.x,this.y)
                children.push(new Node(currentBoard,currentMove[0],currentMove[1],this.oponentTile));
            }

        }
        return children;
    };

问题是在调用makemove()之后,tempBoardthis.board变量都被修改。

是否有任何方法可以在不引用数组的情况下复制数组?


也许帮助

1
2
3
4
function copy(data){
    var result = JSON.stringify(data);
    return JSON.parse(result);
}

.slice()生成数组的浅拷贝,而不是深拷贝。

这意味着,如果您有一个对象数组,并且使用.slice()复制该数组,它将为您提供一个新的数组,该数组是第一级副本。但是新的数组指向与第一个数组相同的所有对象。您可以重新排列复制的数组或从中删除元素,这不会影响第一个数组。

但是,如果修改数组中的对象,则两个数组中的对象相同,因此对数组中的任何对象进行修改(例如更改对象的属性)将在两个数组中看到。

如果您想要数组及其内容的完整副本,那么您必须进行深度复制,这会更复杂一些,并且可能稍微依赖于数组中的具体内容。

有许多不同的方法来制作深度复制。您可以在这些参考资料中了解到其中的许多内容:

如何正确克隆javascript对象?

在javascript中将对象数组复制到另一个数组中(深度复制)

在javascript中按值复制数组

如果保证数组中没有任何循环引用(其中一个对象指向另一个对象,而另一个对象又指向它),那么最简单的复制方法是:

1
var tempBoard = JSON.parse(JSON.stringify(this.board));