web-dev-qa-db-fra.com

copie en profondeur javascript à l'aide de JSON

J'ai un problème avec la copie profonde de l'objet (tableau) javascript. J'ai lu beaucoup de bons moyens pour y faire face. Et je sais aussi que jQuery a $ .extend API pour ce problème. Mais ma question est: puis-je simplement utiliser la méthode JSON stringify et parse pour résoudre ce problème?

Voici mon code:

function deepCopy(oldValue) { 
  var newValue
  strValue = JSON.stringify(oldValue)
  return newValue = JSON.parse(strValue)
}

var a = {
  b: 'b',
  c: [1,2,4],
  d: null
}

copy = deepCopy(a)

console.log(a === copy) // false
console.log(a.c === copy.c) // false

PS: Je sais que si tous les objets ne sont pas sérialisables, mais la seule situation que je connaisse est que lorsque l'objet contient une propriété qui est fonction. Une autre situation?

20
user2666750

Si votre objet est "petit" et contient exclusivement des propriétés sérialisables, un simple hack deepCopy utilisant la sérialisation JSON devrait être OK. Mais, si votre objet est grand, vous pourriez rencontrer des problèmes. Et s'il contient des propriétés non sérialisables, celles-ci disparaîtront:

var o = {
 a: 1,
 b: 2,
 sum: function() { return a + b; }
};

var o2 = JSON.parse(JSON.stringify(o));
console.log(o2);

Rendements:

Object {a: 1, b: 2}

Chose intéressante, un bon nombre de solutions de copie profonde en C # sont des astuces de sérialisation/désérialisation similaires.

Addendum: Je ne sais pas ce que vous espérez en termes de comparaison des objets après la copie. Mais, pour les objets complexes, vous devez généralement écrire votre propre méthode Compare() et/ou Equals() pour une comparaison précise.

Il convient également de noter que ce type de copie ne conserve pas les informations de type.

JSON.parse(JSON.stringify(new A())) instanceof A === false
36
svidgen

Vous pouvez le faire de cette façon, mais c'est problématique pour certaines des raisons énumérées ci-dessus:

  1. Je remets en question la performance.

  2. Avez-vous des propriétés non sérialisables?

  3. Et le plus grand: votre clone manque des informations de type. Selon ce que vous faites, cela pourrait être important. Le réalisateur a-t-il ajouté des méthodes au prototype de vos objets originaux? Ils sont partis. Je ne sais pas quoi d'autre tu vas perdre.

3
Joseph Larson