Di perpustakaan Lodash , dapatkah seseorang memberikan penjelasan yang lebih baik tentang penggabungan dan perluasan / penetapan .
Ini pertanyaan yang sederhana tetapi jawabannya tetap saya hindari.
Di perpustakaan Lodash , dapatkah seseorang memberikan penjelasan yang lebih baik tentang penggabungan dan perluasan / penetapan .
Ini pertanyaan yang sederhana tetapi jawabannya tetap saya hindari.
Jawaban:
Begini caranya extend
/ assign
berfungsi: Untuk setiap properti di sumber, salin nilainya apa adanya ke tujuan. jika nilai properti itu sendiri adalah objek, tidak ada traversal rekursif dari properti mereka. Seluruh objek akan diambil dari sumber dan diatur ke tujuan.
Begini caranya merge
: Untuk setiap properti dalam sumber, periksa apakah properti itu objek itu sendiri. Jika kemudian turun secara rekursif dan mencoba memetakan properti objek anak dari sumber ke tujuan. Jadi intinya kita menggabungkan hierarki objek dari sumber ke tujuan. Sedangkan untuk extend
/ assign
, ini adalah salinan properti satu tingkat sederhana dari sumber ke tujuan.
Inilah JSBin sederhana yang akan membuat ini sejernih kristal: http://jsbin.com/uXaqIMa/2/edit?js,console
Berikut adalah versi yang lebih rumit yang mencakup array dalam contoh juga: 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
adalah alias untuk _.assign
, jadi mereka identiknull
hal yang sama_.defaults
dan _.defaultsDeep
memproses argumen dalam urutan terbalik dibandingkan dengan yang lain (meskipun argumen pertama masih menjadi objek target)_.merge
dan _.defaultsDeep
akan menggabungkan objek anak dan yang lainnya akan menimpa di tingkat root_.assign
dan _.extend
akan menimpa nilai denganundefined
_.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
menangani undefined
tetapi yang lain akan melewatkannya_.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
hal yang sama_.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
dan _.defaultsDeep
akan menggabungkan objek anak_.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" }
Catatan: Seperti yang ditunjukkan @Mistic, Lodash memperlakukan array sebagai objek di mana kunci adalah indeks ke dalam array.
_.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
konflik denganOnly _.assign will overwrite a value with undefined
Perbedaan lain yang harus diperhatikan adalah penanganan undefined
nilai:
mergeInto = { a: 1}
toMerge = {a : undefined, b:undefined}
lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}
lodash.merge({}, mergeInto, toMerge) // => {a: 1, b:undefined}
Jadi merge
tidak akan menggabungkan undefined
nilai menjadi nilai yang ditentukan.
mergeInto
memiliki properti yang toMerge
tidak dimiliki maka itu akan mempertahankan properti itu. Dalam hal ini itu tidak akan menjadi tiruan.
Mungkin juga bermanfaat untuk mempertimbangkan apa yang mereka lakukan dari sudut pandang semantik:
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.
Saya percaya bahwa belajar memikirkan metode-metode tersebut dari sudut pandang semantik akan membuat Anda lebih baik "menebak" apa yang akan menjadi perilaku untuk semua skenario yang berbeda dari nilai yang ada dan yang tidak ada.