2012-02-22 18 views
5

Sto provando a creare una funzione che duplica una matrice di matrici. Ho provato blah.slice (0); ma copia solo i riferimenti. Devo fare un duplicato che lascia intatto l'originale.Come copiare o duplicare una matrice di array

Ho trovato questo metodo prototipo al 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; 
}; 

Funziona, ma scombina un plugin jQuery che sto utilizzando - quindi ho bisogno di trasformarlo su una funzione ... e ricorsività non è il mio più forte.

Il vostro aiuto sarebbe apprezzato!

Cheers,

+1

Assicurati di dichiarare "i" con 'var'! Inoltre è rischioso iterare su un array con un ciclo 'for ... in' - molto più sicuro usare indici numerici. – Pointy

+0

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

risposta

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

Questo ha funzionato perfettamente! Grazie. – Jeremy

+0

fantastico. esattamente quello di cui avevo bisogno! – tuj

2

Per esempio:

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; 
} 

migliorati come da commenti

+1

Interromperà per 'null' (null.pop genererà). Il primo controllo dovrebbe essere qualcosa come 'if (typeof obj! =" Object "||! Obj)'. –

+0

Inoltre, gestione discutibile delle proprietà ereditate - "clone" in JavaScript ha semantica problematica. – Pointy

Problemi correlati