で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.
セマンティックの観点からこれらのメソッドについて考えることを学ぶことで、既存の値と存在しない値のさまざまなシナリオすべての動作をより正確に「推測」できると思います。