La modifica di una copia di un object JavaScript sta causando la modifica dell’object originale

Sto copiando myObj su tempMyObj

 var tempMyObj = myObj; 

tempMyObj.entity è una matrice di oggetti. Sto modificando tempMyObj.entity base ad alcune condizioni. Il problema è se tempMyObj.entity myObj.entity anche myObj.entity viene modificato.

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

È chiaro che tu abbia alcuni fraintendimenti su cosa sia l’istruzione var tempMyObj = myObj; lo fa.

In oggetti JavaScript vengono passati e assegnati per riferimento (più precisamente il valore di un riferimento), quindi tempMyObj e myObj sono entrambi riferimenti allo stesso object.

Ecco un’illustrazione semplificata che può aiutarti a visualizzare ciò che sta accadendo

 // [Object1]< --------- myObj var tempMyObj = myObj; // [Object1]<--------- myObj // ^ // | // ----------- tempMyObj 

Come puoi vedere dopo il compito, entrambi i riferimenti puntano allo stesso object.

È necessario creare una copia se è necessario modificare uno e non l'altro.

 // [Object1]< --------- myObj const tempMyObj = Object.assign({}, myObj); // [Object1]<--------- myObj // [Object2]<--------- tempMyObj 

Vecchia risposta:

Ecco un paio di altri modi per creare una copia di un object

Dal momento che stai già usando jQuery:

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

Con JavaScript vanigliato

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

Vedi qui e qui

Prova a utilizzare $ .extend () :

Se, tuttavia, si desidera conservare entrambi gli oggetti originali, è ansible farlo passando un object vuoto come destinazione:

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


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

Prova a utilizzare il metodo create () come indicato di seguito.

 var tempMyObj = Object.create(myObj); 

Questo risolverà il problema.

Questo potrebbe essere molto difficile, lasciatemi provare a metterlo in un modo semplice. Quando “copia” una variabile in un’altra variabile in javascript, non stai effettivamente copiando il suo valore da una all’altra, stai assegnando alla variabile copiata, un riferimento all’object originale . Per fare effettivamente una copia, è necessario creare un nuovo uso dell’object

La parte difficile è perché c’è una differenza tra l’assegnazione di un nuovo valore alla variabile copiata e la modifica del suo valore. Quando si assegna un nuovo valore alla variabile di copia, si elimina il riferimento e si assegna il nuovo valore alla copia, tuttavia, se si modifica solo il valore della copia (senza assegnare un nuovo valore), si modifica copia e l’originale.

Spero che l’esempio aiuti!

 let original = "Apple"; let copy1 = copy2 = original; copy1 = "Banana"; copy2 = "John"; console.log("ASSIGNING a new value to a copied variable only changes the copy. The ogirinal variable doesn't change"); console.log(original); // Apple console.log(copy1); // Banana console.log(copy2); // John //---------------------------- original = { "fruit" : "Apple" }; copy1 = copy2 = original; copy1 = {"animal" : "Dog"}; copy2 = "John"; console.log("\n ASSIGNING a new value to a copied variable only changes the copy. The ogirinal variable doesn't change"); console.log(original); //{ fruit: 'Apple' } console.log(copy1); // { animal: 'Dog' } console.log(copy2); // John */ //---------------------------- // HERE'S THE TRICK!!!!!!! original = { "fruit" : "Apple" }; let real_copy = {}; Object.assign(real_copy, original); copy1 = copy2 = original; copy1["fruit"] = "Banana"; // we're not assiging a new value to the variable, we're only MODIFYING it, so it changes the copy and the original!!!! copy2 = "John"; console.log("\n MODIFY the variable without assigning a new value to it, also changes the original variable") console.log(original); //{ fruit: 'Banana' } < ====== Ops!!!!!! console.log(copy1); // { fruit: 'Banana' } console.log(copy2); // John console.log(real_copy); // { fruit: 'Apple' } <======== real copy!