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 à _, 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