2012-02-22 13 views
5

Estoy intentando hacer una función que duplique una matriz de matrices. Intenté blah.slice (0); pero solo copia las referencias. Necesito hacer un duplicado que deje el original intacto.Cómo copiar o duplicar una matriz de matrices

me encontré con este método prototipo en http://my.opera.com/GreyWyvern/blog/show.dml/1725165

Object.prototype.clone = function() { 
    var newObj = (this instanceof Array) ? [] : {}; 
    for (i in this) { 
    if (i == 'clone') continue; 
    if (this[i] && typeof this[i] == "object") { 
     newObj[i] = this[i].clone(); 
    } else newObj[i] = this[i] 
    } return newObj; 
}; 

Funciona, pero puede confundir un plugin de jQuery que estoy usando - por lo que necesito para convertirlo en una función ... y recursividad no es mi más fuerte

¡Su ayuda sería apreciada!

Saludos,

+1

Asegúrese de declarar la "i" con 'var'! También es riesgoso iterar sobre una matriz con un bucle 'for ... in', mucho más seguro usar índices numéricos. – Pointy

+0

Ver: http://stackoverflow.com/questions/565430/deep-copying-an-array-using-jquery –

Respuesta

5
function clone (existingArray) { 
    var newObj = (existingArray instanceof Array) ? [] : {}; 
    for (i in existingArray) { 
     if (i == 'clone') continue; 
     if (existingArray[i] && typeof existingArray[i] == "object") { 
     newObj[i] = clone(existingArray[i]); 
     } else { 
     newObj[i] = existingArray[i] 
     } 
    } 
    return newObj; 
} 
+0

¡Esto funcionó perfectamente! Gracias. – Jeremy

+0

impresionante. exactamente lo que necesitaba! – tuj

2

Por ejemplo:

clone = function(obj) { 
    if (!obj || typeof obj != "object") 
     return obj; 
    var isAry = Object.prototype.toString.call(obj).toLowerCase() == '[object array]'; 
    var o = isAry ? [] : {}; 
    for (var p in obj) 
     o[p] = clone(obj[p]); 
    return o; 
} 

mejoraron según los comentarios

+1

Se romperá para 'null' (null.pop se lanzará). El primer control debería ser algo así como 'if (typeof obj! =" Object "||! Obj)'. –

+0

Además, el manejo cuestionable de las propiedades heredadas: "clonar" en JavaScript tiene una semántica problemática. – Pointy

Cuestiones relacionadas