Di perpustakaan Lodash , dapatkah seseorang memberikan penjelasan yang lebih baik tentang penggabungan dan perluasan / penetapan .
Ini pertanyaan yang sederhana tetapi jawabannya tetap saya hindari.
sumber
Di perpustakaan Lodash , dapatkah seseorang memberikan penjelasan yang lebih baik tentang penggabungan dan perluasan / penetapan .
Ini pertanyaan yang sederhana tetapi jawabannya tetap saya hindari.
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)
Lodash versi 3.10.1
Metode dibandingkan
_.merge(object, [sources], [customizer], [thisArg])
_.assign(object, [sources], [customizer], [thisArg])
_.extend(object, [sources], [customizer], [thisArg])
_.defaults(object, [sources])
_.defaultsDeep(object, [sources])
Kesamaan
_.extend
adalah alias untuk_.assign
, jadi mereka identiknull
hal yang samaPerbedaan
_.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
Tes
Mereka semua menangani anggota di root dengan cara yang sama.
_.assign
menanganiundefined
tetapi yang lain akan melewatkannyaMereka semua menangani
null
hal yang samaTetapi hanya
_.merge
dan_.defaultsDeep
akan menggabungkan objek anakDan sepertinya tidak satupun dari mereka yang menggabungkan array
Semua memodifikasi objek target
Tidak ada yang benar-benar berfungsi seperti yang diharapkan pada array
Catatan: Seperti yang ditunjukkan @Mistic, Lodash memperlakukan array sebagai objek di mana kunci adalah indeks ke dalam array.
sumber
_.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:Jadi
merge
tidak akan menggabungkanundefined
nilai menjadi nilai yang ditentukan.sumber
mergeInto
memiliki properti yangtoMerge
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:
_.menetapkan
_.menggabungkan
_.defaults
_.defaultDep
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.
sumber
Jika Anda ingin salinan yang dalam tanpa mengganti sambil mempertahankan
obj
referensi yang samaobj = _.assign(obj, _.merge(obj, [source]))
sumber