我在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()
后,tempBoard
和this.board
变量都被修改。
有没有办法可以复制数据而不参考它?
答案 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);
}