我正在尝试使用从线程中的stackoverflow找到的代码创建包含对象的数组的深层副本,该代码显示了如何创建数组的深层副本。

alert("here"); //this is shown
var newArr = jQuery.extend(true,[],playerLst);
alert("here2") //this is not shown
var returnArr = [];


控制台错误:

Uncaught RangeError: Maximum call stack size exceeded


对对象进行深拷贝是我项目的重要组成部分,在这里确实需要一些帮助。

编辑:

这就是我的对象的赋值方式,对于爱沙尼亚变量,很抱歉,我使用它们使代码更清晰。

for(var i = 0; i<myValues.length;i++){
       var Player = new Object();
       var name = myValues[i];
       Player["name"] = name;
       Player["voor_1"] = 0;
       Player["voor_2"] = 0;
       Player["voor_3"] = 0;
       Player["voor_4"] = 0;
       Player["voor_5"] = 0;
       Player["voor_6"] = 0;
       Player["voor_7"] = 0;
       Player["punkte"] = 0;
       Player["koef"] = 0;
       Player["suhe"] = "0:0";
       Player["koht"] = i+1;
       Player["playedNames"] = [];
       playerLst.push(Player);
   }


E3:

最佳答案

您正在将一个对象引用到同一棵树中的另一个对象,因此最终将导致一个循环。

Players: {
    name1: {
        hasPlayedWith: name2 // *
    },
    name2: {
        hasPlayedWith: name1 // *
    }
}

/* deep copy now copies name2/name1,
which references back to name1/name2.
You're now ending up in a never ending loop,
named circular reference
(or reference cycle, circular structure, ...) */


为了避免这种情况,您可以将播放器的名称另存为字符串,然后使用Players ['name']进行调用

Players: {
    name1: {
        hasPlayedWith: 'name2'
    },
    name2: {
        hasPlayedWith: 'name1'
    }
}

10-08 00:05