2015-08-27 17 views
5

Sto usando js/jQuery e sto tentando di creare un vero clone - Attualmente sto usando jQuery per questo. Mi aspetterei che negli oggetti multi-livello anche gli oggetti figlio dovrebbero essere clonati in profondità, ma sembra che non sia così. Di seguito è riportato il mio codice di test e out put che mi porta a credere che il clone di jQuery non in realtà cloni tutti gli oggetti figlio.jQuery deep clone non è ricorsivo

qualcuno ha scritto una vera funzione di clonazione profonda o esiste un modo per rendere il lavoro di jQuery come previsto?

Codice:

function deepClone (obj) { 
    return $.extend(true, {}, obj); 
}; 

var orig = {}; 
orig.companyData = {}; 
orig.companyData.TEST= 1; 

var deep1 = deepClone(orig); 
deep1.companyData.TEST= 0; 

var deep2 = deepClone(orig); 

console.log("orig: " + orig.companyData.TEST); 
console.log("deep1: " + deep1.companyData.TEST); 
console.log("deep2: " + deep2.companyData.TEST); 

Console in uscita:

Nota: mi aspetto 1, 0, 1

0 
0 
0 
+0

È possibile aggiungere il codice in cui sono definiti orig e companyData? – Chitrang

+0

@Chitrang l'ha aggiunto ora –

+1

Sembra funzionare come previsto ... https://jsfiddle.net/ufm3vyvL/ –

risposta

0

funzione di estendere jQuery sembra funzionare sulla maggior parte degli oggetti, alcuni utenti hanno suggerito che il problema potrebbe essere con il modo in cui il mio oggetto js era created- Non sono sicuro di quello che il colpevole è, ma la mia soluzione è la seguente:

function deepClone(obj) { 
    return $.parseJSON(JSON.stringify(obj)); 
}; 
0

si deve passare entrambi gli oggetti da combinare

function deepClone (obj1, obj2) { 
    return $.extend(true, obj1, obj2); 
}; 

var orig = {}; 
orig.companyData = {}; 
orig.companyData.TEST = 1; 

var deep1 = deepClone(deep1, orig); 
deep1.companyData.TEST= 0; 
var deep2 = deepClone(deep2, orig); 

console.log("orig: " + orig.companyData.TEST); 
console.log("deep1: " + deep1.companyData.TEST); 
console.log("deep2: " + deep2.companyData.TEST); 

See this code running

+0

Stampa ancora 0, 0, 0, il che ha senso: quando stai "passando in deep1" non è definito. –

+1

Penso che intendesse creare un oggetto vuoto. '{}' –

+0

@JakeMorrison Guarda la mia funzione deepClone, questo è quello che sto facendo. –