Il y a mon problème:
J'ai une fonction qui ajoutez un élément à un tableau (A), l'élément à ajouter provient de l'argument. Ensuite, lorsque je modifierai cet élément dans le tableau (A), il modifie également l'élément que j'ai utilisé comme argument. P>
Il ressemble à celui: P>
P>
addTemplates(nTemplate){
let k = nTemplate;
k.id=this.templates.length+1;
this.templates.push(k);
this.emitTemplateSubject();
}
//when I use the function:
let aObject={id:1, sth:"aa", sthE:"bb"}
addTemplate(aObject);
//then aObject.id is also change.4 Réponses :
Vous devez créer une copie de votre objet, puis l'envoyer à la fonction
let newObject = Object.assign({}, aObject);
addTemplate(newObject );
Notez que lors de l'utilisation de l'opérateur de répression sur un objet comportant des objets comme des propriétés, ces objets seront référencés: const aobject = {enfant: {"propriété": "valeur"}}; const Spread = {... AObject}; répandre.child.property = "nouvelle valeur"; console.log (aobject.child.property === Spread.child.Property); code>
avec Un exemple simple qui montre la différence entre une référence et une copie (dans Ce cas, je crée une copie à l'aide de JSON.PARSE (JSON.Stringify (...)), que je ne recommanderais pas pour les projets réels réels): p> p> this.templates.push (k); code>, vous ajoutez une référence, pas une copie, de k code> à modèles code>. Par conséquent, lorsque vous modifiez les propriétés de la référence dans le tableau, vous modifiez le même objet que lors de la modification directe k code>. const original = {"property":"value"};
const reference = original;
const copy = JSON.parse(JSON.stringify(original));
const array = [reference, copy];
array[0].property = 'new value for reference';
array[1].property = 'new value for copy';
console.log(reference.property === original.property);
console.log(copy.property !== original.property);
Vous pouvez utiliser le Spread opérateur et avoir quelque chose comme:
Notez que lors de l'utilisation de l'opérateur de répression sur un objet comportant des objets comme des propriétés, ces objets seront référencés: const aobject = {enfant: {"propriété": "valeur"}}; const Spread = {... AObject}; répandre.child.property = "nouvelle valeur"; console.log (aobject.child.property === Spread.child.Property); code>
Vous pouvez essayer quelque chose comme ci-dessous et utiliser Attribuer un mot-clé pour créer de nouveaux objets au lieu d'attribuer des réfractions.
let aObject = {
id: 1, sth: "aa", sthE: "bb"
}
addTemplates(aObject);
function addTemplates(nTemplate) {
let k = Object.assign({}, nTemplate);
k.id=this.templates.length+1;
this.templates.push(k);
this.emitTemplateSubject();
}
La plupart des réponses que vous obtiendrez vous recommanderont de différentes façons de créer un clone peu profond de votre objet. En supposant que vos objets ne soient pas tous aussi simples que celui de votre question, vous seriez probablement mieux à regarder dans Clonage profond d'objets JavaScript . TL; DR: Dans mon opinion personnelle, Importation de
Clonedeep () Code> La méthode est la solution la plus simple et la plus robuste pour angulaire.