J'ai écrit un rapide jsfiddle ici , dans lequel je passe un petit objet JSON à une nouvelle variable et modifie les données à partir de la variable d'origine (pas la nouvelle variable), mais les données de la nouvelle variable sont également mises à jour. Cela doit signifier que l'objet JSON a été passé par référence, n'est-ce pas?
Voici mon code rapide:
var json_original = {one:'one', two:'two'}
var json_new = json_original;
console.log(json_original); //one, two
console.log(json_new); //one, two
json_original.one = 'two';
json_original.two = 'one';
console.log(json_original); //two, one
console.log(json_new); //two, one
Existe-t-il un moyen de créer une copie complète d'un objet JSON afin que la modification de la variable d'origine ne modifie pas la nouvelle variable?
J'ai constaté que ce qui suit fonctionne si vous n'utilisez pas jQuery et que vous souhaitez uniquement cloner des objets simples (voir les commentaires).
JSON.parse(JSON.stringify(json_original));
Documentation
Votre seule option est en quelque sorte de cloner l'objet.
Voir cette question de stackoverflow pour savoir comment y parvenir.
Pour les objets JSON simples, le moyen le plus simple serait:
var newObject = JSON.parse(JSON.stringify(oldObject));
si vous utilisez jQuery, vous pouvez utiliser:
// Shallow copy
var newObject = jQuery.extend({}, oldObject);
// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
MISE À JOUR 2017: Comme il s'agit d'une réponse répandue, je devrais mentionner qu'il existe désormais de meilleurs moyens d'y parvenir à l'aide de nouvelles versions de javascript:
Dans ES6 ou TypeScript (2.1+):
var shallowCopy = { ...oldObject };
var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" };
Notez que si extraProp
est également une propriété de oldObject, sa valeur ne sera pas utilisée car le extraProp : "abc"
est spécifié plus tard dans l'expression, ce qui la remplace essentiellement. Bien entendu, oldObject ne sera pas modifié.