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

时间:2016-05-26 01:15:45

标签: javascript arrays

我在javascript上有这个课程:

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;

};

我正在使用此功能,使用this.board

tempBoard变量(这是一个数组)复制到slice()变量
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变量都被修改。

有没有办法可以复制数据而不参考它?

2 个答案:

答案 0 :(得分:1)

.slice()制作数组的浅表副本,而不是深层副本。

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

但是,如果修改数组中的对象,则它们是两个数组中的相同对象,因此可以在两个数组中看到对数组中任何对象的修改(例如更改对象上的属性)。 / p>

如果你想要一个完整的数组副本及其内容,那么你必须做一个更复杂的深层复制,并且可以稍微依赖于你在数组中的具体内容。

有许多不同的方法可以制作深层复制品。您可以在这些参考文献中阅读其中的许多内容:

How do I correctly clone a JavaScript object?

Copying an array of objects into another array in javascript (Deep Copy)

Copying array by value in JavaScript

如果您保证阵列中没有任何循环引用(其中一个对象指向另一个指向它的另一个对象),那么制作副本的最简单方法是:

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

答案 1 :(得分:1)

也许帮助

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