La problème que tu as dans ton cas, c'est que tu as probablement des objets qui sont placés sur le prototype de la classe Object.
Ceci créera un objet avec une profondeur infini :
Code Javascript :
Object.prototype.obj = {valeur : "obj"};
{test : "1"}.obj.obj.obj.obj.obj.obj.valeur == "obj"
Il y a deux façons de résoudre le problème, soit que tu limites la profondeur de la copie ou que tu ne copie pas ce qui est hérité de Object.
Solution 1 (profondeur maximal):
Code Javascript :
function clone(obj, maxDepth) {
if(obj == null || typeof(obj) != 'object')
return obj;
var temp = new obj.constructor();
for(var key in obj) {
if (maxDepth > 1)
temp[key] = clone(obj[key], maxDepth - 1);
else
temp[key] = obj[key];
}
return temp;
}
Solution 2 (omission du prototype de la classe Object) :
Code Javascript :
function clone(obj){
if(obj == null || typeof(obj) != 'object')
return obj;
var objPrototype = Object.prototype;
var temp = new obj.constructor();
for(var key in obj) {
if (!objPrototype[key])
temp[key] = clone(obj[key]);
}
return temp;
}