我以前也遇到过这个问题,为了得到我想要的结果,我对它进行了黑客攻击,但最终还是碰壁了,我不明白为什么会这样。
在JavaScript中,如何只捕获不指向原始对象的浅拷贝?快把我逼疯了。我知道JS中的所有东西都是一个指针,但是必须有一种方法来获得一个深度副本,当修改它时,不会改变原始对象。下面是我正在使用的代码:
MyGame.runAllPossibleMoves = function() {
MyGame.ai_object.board = MyGame.tetrominos;
MyGame.ai_object.piece = MyGame.tetromino;
for(var i = 0; i < 10; i++){
if(i < MyGame.ai_object.piece.pivot.x){
while(moveLeft() && i < MyGame.ai_object.piece.pivot.x){
//do piece movement
}
hardDrop();
}
console.log(MyGame.ai_object.piece.pivot.x + ',' + MyGame.ai_object.piece.pivot.y);
console.log(MyGame.tetromino.pivot.x + ',' + MyGame.tetromino.pivot.y);
MyGame.ai_object.board = MyGame.tetrominos;
MyGame.ai_object.piece = MyGame.tetromino;
//console.log(MyGame.ai_object.piece);
}
}当我真正想要做的是修改我创建的临时变量并使用MyGame.tetromino重置我的临时对象时,这个对象MyGame.tetromino正在被更新为任何MyGame.ai_object.piece。我哪里出错了?
发布于 2015-04-07 06:30:08
这是最简单的,并且假设没有什么不安全地扩展了Object.prototype
Object.shallowCopy = function(obj) {
var r = Array.isArray(obj) ? new Array(obj.length) : {};
for (var k in obj) {
r[k] = obj[k];
}
return r;
}由于这是一个浅拷贝,任何“复制”的值--即对象本身--都将保持对原始值的引用。
在各种图书馆中都存在着等价的函数。特别是(没有与jQuery相关的DOM行李),underscore.js中有_.clone
编辑-对于深拷贝来说,简单的递归应该足够了,再次假设Object.prototype和Array.prototype都没有被不安全地修改:
Object.deepCopy = function(obj) {
var r = obj;
if (typeof obj === 'object') {
r = Array.isArray(obj) ? new Array(obj.length) : {};
for (var k in obj) {
r[k] = Object.deepCopy(obj[k]);
}
}
return r;
}注意:如果传递了一个包含对自身的循环引用的结构,此函数将无法完成。
发布于 2015-04-07 07:20:37
当我意识到我要的是一份浅薄的副本,但确实需要一份深拷贝(由于某种原因,我想是咖啡因不够),我在网上和其他几个答案中发现了这一点:
MyGame.ai_object.board = (JSON.parse(JSON.stringify(MyGame.tetrominos)));
MyGame.ai_object.piece = (JSON.parse(JSON.stringify(MyGame.tetromino)));这就创造了我一直在寻找的深刻的复制品。还有几个其他的答案,所以我发现了我的错误。
编辑:
使用JSON.parse(JSON.stringify(obj))会消耗大量的资源。以下是获取深度副本的另一种方法:
deepCopy = function(obj){
var temp;
for(var n in obj){
temp[n] = obj[n];
}
return temp;
}这将复制obj中的每个项,并将其分配给新对象temp。这将不会创建obj中任何对象的深度副本(您必须再次调用deepCopy )。
https://stackoverflow.com/questions/29485073
复制相似问题