2015-08-27 12 views
5

Ich verwende js/jQuery und versuche, einen echten Klon zu erstellen - ich verwende derzeit jQuery für diesen Zweck. Ich würde erwarten, dass in mehrstufigen Objekten sogar die untergeordneten Objekte tief geklont werden sollten, aber dies scheint nicht der Fall zu sein. Unten ist mein Testcode und output, der mich zu der Annahme führt, dass der tiefe Klon von jQuery nicht wirklich alle untergeordneten Objekte klont.jQuery Deep Clone ist nicht rekursiv

hat jemand eine echte tiefe Klonfunktion geschrieben, oder gibt es eine Möglichkeit, jQuery's Arbeit wie erwartet zu machen?

Code:

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

Konsolenausgabe:

Hinweis: Ich erwarte, 1, 0, 1

0 
0 
0 
+0

Könnten Sie den Code hinzufügen, wo orig und companyData definiert sind? – Chitrang

+0

@Chitrang hinzugefügt, um es jetzt –

+1

scheint wie erwartet zu funktionieren ... https://jsfiddle.net/ufm3vyvL/ –

Antwort

0

jQuery erweitert Funktion auf den meisten Objekten zu arbeiten scheint, haben einige Nutzer vorgeschlagen, dass das Problem mit der Art und Weise sein kann, dass mein js Objekt ist created- Ich bin nicht sicher, was die Ursache ist, aber Meine Lösung ist unten:

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

Sie müssen beide Objekte passieren zu kombinieren

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

Es druckt immer noch 0, 0, 0, was Sinn macht: Wenn Sie "in Deep1" übergeben, ist es undefiniert. –

+1

Ich denke, er wollte ein leeres Objekt machen. '{}' –

+0

@JakeMorrison Schau dir meine deepClone-Funktion an, das mache ich. –