オブジェクトの配列をネストされたオブジェクトで複製しようとしています。
何かのようなもの:
var data = [
{ id: 1, values: { a: 'a', b: 'b' } },
{ id: 2, values: { c: 'c', d: 'd' } }
];
_.clone
メソッドとisDeep
でtrue
パラメーターを使用する場合:
var clone = _.clone(data, true);
data[1].values.d = 'x';
console.log( _.isEqual(data, clone) ); // true, clone[1].values.d == 'x'
私はclone[1].values.d == 'd'
を期待していました:
IsDeepがtrueの場合、ネストされたオブジェクトも複製されます。そうでない場合、参照によって割り当てられます。
なにが問題ですか?
さらに、 _.cloneDeep
メソッドを使用すると、エラーが発生します:
var clone = _.cloneDeep(data);
// Uncaught TypeError: Object function u(n){return n instanceof u?n:new o(n)}
// has no method 'cloneDeep'
なぜこのエラーですか?
$.extend
を使用すると、クローンは期待どおりに元のオブジェクトへの参照を持ちません。
var clone = $.extend(true, {}, data);
console.log( _.isEqual(data, clone) ); // false, clone[1].values.d == 'd'
Gruff BunnyとLouisのコメントのおかげで、私は問題の原因を見つけました。
Backbone.jsも使用するため、BackboneおよびUnderscoreと互換性のある一部の機能を無効にするLodashの特別なビルドをロードしました。この例では:
var clone = _.clone(data, true);
data[1].values.d = 'x';
_.isEqual(data, clone) === false
_.isEqual(data, clone) === true
BackboneアプリケーションでUnderscoreビルドをNormalビルドに置き換えただけで、アプリケーションはまだ動作しています。これで、期待どおりの動作でLodash .cloneを使用できるようになりました。
2018:アンダースコアビルド もう存在しないようです を編集します。 2018年にこれを読んでいるなら、 このドキュメント (Backbone and Lodash)に興味があるかもしれません。