でLodashのライブラリ、缶誰かがより良い説明を提供マージをして/割り当てを拡張します。
簡単な質問ですが、答えはそれでも私を回避します。
でLodashのライブラリ、缶誰かがより良い説明を提供マージをして/割り当てを拡張します。
簡単な質問ですが、答えはそれでも私を回避します。
回答:
ここではどのようだextend
/ assign
宛先に-があるとして、ソースの各プロパティについて、その値をコピーします作品。プロパティ値自体がオブジェクトである場合、それらのプロパティの再帰的な走査はありません。オブジェクト全体がソースから取得され、宛先に設定されます。
ここではどのようだmerge
そのプロパティは、オブジェクト自体である場合は、ソースの各プロパティについて、確認してください:作品。それが再帰的にダウンしている場合は、子オブジェクトのプロパティをソースから宛先にマップしてみてください。したがって、基本的には、オブジェクト階層をソースから宛先にマージします。用しながらextend
/ assign
、それは元から宛先へのプロパティの単純な1つのレベルのコピーです。
この結晶は明らかになるだろう。ここのシンプルなJSBin: http://jsbin.com/uXaqIMa/2/edit?js,console
以下は、例にも配列を含むより精巧なバージョンです:http : //jsbin.com/uXaqIMa/1/edit?js,console
var combined = merge({}, src, dest)
_.merge(object, [sources], [customizer], [thisArg])
_.assign(object, [sources], [customizer], [thisArg])
_.extend(object, [sources], [customizer], [thisArg])
_.defaults(object, [sources])
_.defaultsDeep(object, [sources])
_.extend
のエイリアスであるため_.assign
、同じですnull
同じように処理します_.defaults
及び_.defaultsDeep
(最初の引数は依然として目標オブジェクトであるが)、他と比較して逆の順序で引数を処理します_.merge
そして、_.defaultsDeep
子オブジェクトをマージし、他の人がルートレベルに上書きされます_.assign
で_.extend
値を上書きしますundefined
_.assign ({}, { a: 'a' }, { a: 'bb' }) // => { a: "bb" }
_.merge ({}, { a: 'a' }, { a: 'bb' }) // => { a: "bb" }
_.defaults ({}, { a: 'a' }, { a: 'bb' }) // => { a: "a" }
_.defaultsDeep({}, { a: 'a' }, { a: 'bb' }) // => { a: "a" }
_.assign
処理しますundefined
が、他の人はそれをスキップします_.assign ({}, { a: 'a' }, { a: undefined }) // => { a: undefined }
_.merge ({}, { a: 'a' }, { a: undefined }) // => { a: "a" }
_.defaults ({}, { a: undefined }, { a: 'bb' }) // => { a: "bb" }
_.defaultsDeep({}, { a: undefined }, { a: 'bb' }) // => { a: "bb" }
null
同じように扱います_.assign ({}, { a: 'a' }, { a: null }) // => { a: null }
_.merge ({}, { a: 'a' }, { a: null }) // => { a: null }
_.defaults ({}, { a: null }, { a: 'bb' }) // => { a: null }
_.defaultsDeep({}, { a: null }, { a: 'bb' }) // => { a: null }
_.merge
、_.defaultsDeep
子オブジェクトのみをマージします_.assign ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "b": "bb" }}
_.merge ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a", "b": "bb" }}
_.defaults ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a" }}
_.defaultsDeep({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a", "b": "bb" }}
_.assign ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "bb" ] }
_.merge ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "bb" ] }
_.defaults ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "a" ] }
_.defaultsDeep({}, {a:['a']}, {a:['bb']}) // => { "a": [ "a" ] }
a={a:'a'}; _.assign (a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.merge (a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.defaults (a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.defaultsDeep(a, {b:'bb'}); // a => { a: "a", b: "bb" }
注:@Misticが指摘したように、Lodashは配列を、キーが配列へのインデックスであるオブジェクトとして扱います。
_.assign ([], ['a'], ['bb']) // => [ "bb" ]
_.merge ([], ['a'], ['bb']) // => [ "bb" ]
_.defaults ([], ['a'], ['bb']) // => [ "a" ]
_.defaultsDeep([], ['a'], ['bb']) // => [ "a" ]
_.assign ([], ['a','b'], ['bb']) // => [ "bb", "b" ]
_.merge ([], ['a','b'], ['bb']) // => [ "bb", "b" ]
_.defaults ([], ['a','b'], ['bb']) // => [ "a", "b" ]
_.defaultsDeep([], ['a','b'], ['bb']) // => [ "a", "b" ]
_.extend is an alias for _.assign, so they are identical
競合Only _.assign will overwrite a value with undefined
注意すべきもう1つの違いは、undefined
値の処理です。
mergeInto = { a: 1}
toMerge = {a : undefined, b:undefined}
lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}
lodash.merge({}, mergeInto, toMerge) // => {a: 1, b:undefined}
したがって、値を定義済みの値にmerge
マージしませんundefined
。
mergeInto
持っていなかったプロパティがある場合は、toMerge
それらのプロパティが保持されます。その場合、それはクローンではありません。
セマンティックの観点から彼らが何をするかを検討することも役立つでしょう:
will assign the values of the properties of its second parameter and so on,
as properties with the same name of the first parameter. (shallow copy & override)
merge is like assign but does not assign objects but replicates them instead.
(deep copy)
provides default values for missing values.
so will assign only values for keys that do not exist yet in the source.
works like _defaults but like merge will not simply copy objects
and will use recursion instead.
セマンティックの観点からこれらのメソッドについて考えることを学ぶことで、既存の値と存在しない値のさまざまなシナリオすべての動作をより正確に「推測」できると思います。