在类原型函数中复制javascript数组
我有一个关于javascript的类:在类原型函数中复制javascript数组,javascript,arrays,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; };
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
变量
var getChildren=function(){
if(this.x==-1&&this.y==-1){
var moves=getAllValidMoves(this.board,this.playertle);
}
否则{
var tempBoard=this.board.slice();
makeMove(tempBoard,this.playertle,this.x,this.y);
var moves=getAllValidMoves(临时板,this.playertle);
}
var children=[];
for(var i=0;i.slice()
生成数组的浅拷贝,而不是深拷贝
这意味着,如果您有一个对象数组,并且使用.slice()
创建该数组的副本,它将为您提供一个新数组,该数组是一级副本。但新数组指向与第一个数组相同的所有对象。您可以重新排列复制的数组或从中删除元素,这不会影响第一个数组
但是,如果修改数组中的对象,则两个数组中的对象是相同的,因此对数组中的任何对象进行修改(例如更改对象的属性)将在两个数组中看到
如果您想要数组及其内容的完整副本,那么您必须制作一个更复杂的深度副本,这稍微取决于数组中的确切内容
制作深度复制有许多不同的方法。您可以在以下参考资料中阅读其中的许多方法:
如果保证数组中没有任何循环引用(其中一个对象指向另一个对象,而另一个对象又指向该对象),则创建副本的最简单方法是:
var tempBoard = JSON.parse(JSON.stringify(this.board));
.slice()
生成数组的浅拷贝,而不是深拷贝
这意味着,如果您有一个对象数组,并且使用.slice()
创建该数组的副本,它将为您提供一个新数组,该数组是一级副本。但新数组指向与第一个数组相同的所有对象。您可以重新排列复制的数组或从中删除元素,这不会影响第一个数组
但是,如果修改数组中的对象,则两个数组中的对象是相同的,因此对数组中的任何对象进行修改(例如更改对象的属性)将在两个数组中看到
如果您想要数组及其内容的完整副本,那么您必须制作一个更复杂的深度副本,这稍微取决于数组中的确切内容
制作深度复制有许多不同的方法。您可以在以下参考资料中阅读其中的许多方法:
如果保证数组中没有任何循环引用(其中一个对象指向另一个对象,而另一个对象又指向该对象),则创建副本的最简单方法是:
var tempBoard = JSON.parse(JSON.stringify(this.board));
也许有帮助
function copy(data){
var result = JSON.stringify(data);
return JSON.parse(result);
}
也许有帮助
function copy(data){
var result = JSON.stringify(data);
return JSON.parse(result);
}
所以你想要一个深度拷贝?.slice()
只做一个浅拷贝。var tempBoard=[];this.board.slice().forEach(函数(b){tempBoard.push(b)};@JoseHermosillaRodrigo:这没什么不同。数组中的数据类型是什么this.board
?那么你想要深度拷贝吗?slice()
只做一个浅拷贝。var tempBoard=[];this.board.slice().forEach(函数(b){tempBoard.push(b)})@JoseHermosillaRodrigo:没什么不同。数组这个.board
中是什么类型的数据?哦,这很有趣。那么,是的,我需要一个深度副本。我的数组只包含字符串。@PabloEstrada-你确定数组只包含字符串吗?因为字符串在Javascript中是不可变的,所以.slice()
可以复制一份。你能告诉我们数组中实际有什么,以及为什么你认为两者都在改变吗?对不起,我错了。我有一个字符串数组。像这样
@PabloEstrada-那么你确实需要一个深度副本。我添加了几个关于制作深度副本的方法的参考和一个示例。感谢完整的答案:)stringify为我工作。哦,这很有趣。那么,是的,我需要一个深度副本。我的数组只包含字符串。@PabloEstrada-你确定数组只包含字符串吗?因为字符串在Javascript中是不可变的,所以.slice()
可以复制一份。你能告诉我们数组中实际有什么,以及为什么你认为两者都在改变吗?对不起,我错了。我有一个字符串数组。像这样
@PabloEstrada-那么你确实需要一个深度副本。我添加了几个关于制作深度副本的方法的参考资料和一个示例。谢谢你完整的回答:)stringify对我有用。