web-dev-qa-db-ja.com

Lodash .cloneおよび.cloneDeepの動作

オブジェクトの配列をネストされたオブジェクトで複製しようとしています。

何かのようなもの:

var data = [
    { id: 1, values: { a: 'a', b: 'b' } },
    { id: 2, values: { c: 'c', d: 'd' } }
];

_。クローン

_.clone メソッドとisDeeptrueパラメーターを使用する場合:

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

さらに、 _.cloneDeep メソッドを使用すると、エラーが発生します:

var clone = _.cloneDeep(data);

// Uncaught TypeError: Object function u(n){return n instanceof u?n:new o(n)}
// has no method 'cloneDeep'

なぜこのエラーですか?

$ .extend

$.extend を使用すると、クローンは期待どおりに元のオブジェクトへの参照を持ちません。

var clone = $.extend(true, {}, data);

console.log( _.isEqual(data, clone) ); // false, clone[1].values.d == 'd' 
34
GG.

Gruff BunnyとLouisのコメントのおかげで、私は問題の原因を見つけました。

Backbone.jsも使用するため、BackboneおよびUnderscoreと互換性のある一部の機能を無効にするLodashの特別なビルドをロードしました。この例では:

var clone = _.clone(data, true);

data[1].values.d = 'x';

BackboneアプリケーションでUnderscoreビルドをNormalビルドに置き換えただけで、アプリケーションはまだ動作しています。これで、期待どおりの動作でLodash .cloneを使用できるようになりました。

2018:アンダースコアビルド もう存在しないようです を編集します。 2018年にこれを読んでいるなら、 このドキュメント (Backbone and Lodash)に興味があるかもしれません。

23
GG.