Lodash .clone et .cloneDeep comportements
J'essaie de cloner un tableau d'objets avec des objets imbriqués.
Quelque chose comme:
var data = [
{ id: 1, values: { a: 'a', b: 'b' } },
{ id: 2, values: { c: 'c', d: 'd' } }
];
_.Clone
Avec le _.clone
méthode et la isDeep
paramètre à true
:
var clone = _.clone(data, true);
data[1].values.d = 'x';
console.log( _.isEqual(data, clone) ); //true, clone[1].values.d == 'x'
Je m'attendais à clone[1].values.d == 'd'
:
Si isDeep est vrai des objets imbriqués seront également cloné, sinon ils
va être affecté par référence.
Quel est le problème?
_.CloneDeep
En plus, quand j'essaie avec la _.cloneDeep
méthode, j'obtiens une erreur:
var clone = _.cloneDeep(data);
//Uncaught TypeError: Object function u(n){return n instanceof u?n:new o(n)}
//has no method 'cloneDeep'
Pourquoi cette erreur?
$.étendre
Avec $.étendre
le clone n'a pas de référence à l'objet original comme prévu:
var clone = $.extend(true, {}, data);
console.log( _.isEqual(data, clone) ); //false, clone[1].values.d == 'd'
Êtes-vous sûr que vous appelez le lodash version de clone et pas le trait de soulignement version? Je reçois le même comportement que vous décrivez si j'ajoute lodash.js en premier, suivi par underscore.js.
Si j'utilise le code en question et d'attribuer lodash à
Si j'utilise le code en question et d'attribuer lodash à
_
, je ne peux pas reproduire le problème mentionné dans la question. (Qui est, _.clone
avec isDeep
ensemble de true
fonctionne comme prévu.) Bourru du Lapin hypothèse est bonne. Je crois qu'il y a aussi une façon d'utiliser lodash exacte de la baisse-dans le remplacement pour underscore.js. Je m'attends à une telle utilisation de lodash de ne pas effectuer de profondes copies depuis underscore.js ne pas le faire.
OriginalL'auteur GG. | 2014-02-18
Vous devez vous connecter pour publier un commentaire.
Merci pour Ton Lapin et Louis commentaires, j'ai trouvé la source du problème.
Que j'utilise Backbone.js aussi, j'ai chargé une compilation spéciale de Lodash compatible avec la Dorsale et le trait de Soulignement qui désactive certaines fonctionnalités. Dans cet exemple:
_.isEqual(data, clone) === false
_.isEqual(data, clone) === true
J'ai juste remplacé le trait de Soulignement construire avec la Normale de construire dans mon épine Dorsale de l'application et l'application est toujours en cours de travail. Donc, je peux maintenant utiliser la Lodash .clone avec le comportement attendu.
Modifier 2018: le trait de Soulignement construire il ne semble pas exister plus. Si vous lisez ceci en 2018, vous pourriez être intéressé par cette documentation (Dorsale et Lodash).
Non, Lodash remplace le trait de Soulignement.
OriginalL'auteur GG.