2015-03-14 11 views
10

I myObj zu tempMyObjeine Kopie eines JavaScript-Objekt ändern verursachen das ursprüngliche Objekt

var tempMyObj = myObj; 

tempMyObj.entity kopierte zu ändern, ist ein Array von Objekten. Ich modifiziere tempMyObj.entity basierend auf einigen Bedingungen. Das Problem ist, wenn ich ändern tempMyObj.entity die myObj.entity wird auch geändert.

for (j = 0; j < myObj.length; j++) { 
    if (myObj[j].type == "TableShape") { 
     var dupEntites = new Array(); 
     for (i = 0; i < myObj[j].entities.length; i++) { 
      if (chk.value != myObj[j].entities[i].id) { 
       var obj = {}; 
       obj.text = myObj[j].entities[i].text; 
       obj.id = myObj[j].entities[i].id; 
       dupEntites.push(obj); 
      } 
      else { 
       if (chk.checked) 
       { 
        var obj = {}; 
        obj.text = myObj[j].entities[i].text; 
        obj.id = myObj[j].entities[i].id; 
        dupEntites.push(obj); 
       } 
      } 
     } 
     tempMyObj[j].entities = dupEntites; 
    } 
} 
+2

können Sie Ihre Frage bearbeiten, um eine Frage zu stellen? – kamaradclimber

+0

Dies könnte helfen, wenn Sie nicht jQuery verwenden: http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – tomek550

Antwort

16

Es ist klar, dass Sie einige Missverständnisse darüber haben, was die Anweisung var tempMyObj = myObj; tut.

In JavaScript werden Objekte übergeben und per Referenz zugewiesen (genauer gesagt, der Wert einer Referenz), also sind tempMyObj und myObj beide Referenzen auf das gleiche Objekt.

Hier ist eine vereinfachte Darstellung, die Sie visualisieren können helfen, was

// [Object1]<--------- myObj 

var tempMyObj = myObj; 

// [Object1]<--------- myObj 
//  ^
//   | 
//   ----------- tempMyObj 

Wie Sie nach der Zuweisung sehen geschieht, werden beide Referenzen auf das gleiche Objekt zeigen.

Sie müssen erstellen Sie eine Kopie, wenn Sie eine und nicht die andere ändern müssen.

// [Object1]<--------- myObj 

var tempMyObj = jQuery.extend(true, {}, myObj); 

// [Object1]<--------- myObj 
// [Object2]<--------- tempMyObj 

Hier sind ein paar Möglichkeiten, von

Da Sie bereits eine Kopie eines Objekts zu schaffen sind mit jQuery:

var newObject = jQuery.extend(true, {}, myObj); 

Mit Vanille JavaScript

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
     if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
} 

var newObject = clone(myObj); 

Siehe here und here

+1

@JAAulde, vielen Dank für die Aktualisierung der Antworten post Ihr Update auf die Frage. Ich bin mir nicht sicher, ob ich das verstanden hätte. – robbmj

+2

Kein Problem! Wenn ich eine so umfangreiche Bearbeitung zu einer Frage mache, die beantwortet wurde, versuche ich zu folgen. :) – JAAulde

1

Versuchen Sie es mit $.extend():

Wenn Sie jedoch beide der ursprünglichen Objekte erhalten möchten, können Sie kann ein leeres Objekt als Ziel so tun, indem man:

var object = $.extend({}, object1, object2);


var tempMyObj = $.extend({}, myObj); 
+0

Bingo, das war was ich vor schreibe .. :) – Rohit416

+2

JavaScript hat jetzt eine ähnliche eingebaute Funktion, ['Object.assign()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Objekt/zuweisen). Beispielverwendung: 'Object.assign ({}, myObj)'. –

Verwandte Themen