In Lodash kütüphane, kutu birisi daha iyi bir açıklama birleştirme ve / ata uzatmak .
Bu basit bir soru ama cevap yine de beni kaçıyor.
In Lodash kütüphane, kutu birisi daha iyi bir açıklama birleştirme ve / ata uzatmak .
Bu basit bir soru ama cevap yine de beni kaçıyor.
Yanıtlar:
Şöyle extend
/ assign
çalışır: Kaynaktaki her özellik için değerini olduğu gibi hedefe kopyalayın. özellik değerlerinin kendileri nesne ise, özelliklerinde özyinelemeli geçiş olmaz. Tüm nesne kaynaktan alınır ve hedefe ayarlanır.
Şöyle merge
çalışır: Kaynaktaki her özellik için, o özelliğin nesnenin kendisi olup olmadığını kontrol edin. Öyleyse, özyinelemeli olarak aşağı inin ve alt nesne özelliklerini kaynaktan hedefe eşlemeye çalışın. Yani esasen nesne hiyerarşisini kaynaktan hedefe birleştiriyoruz. extend
/ İçin iken assign
, özelliklerin kaynaktan hedefe basit bir düzeyli kopyasıdır.
İşte bu kristali netleştirecek basit JSBin: http://jsbin.com/uXaqIMa/2/edit?js,console
Örnekte dizi içeren daha ayrıntılı sürüm: 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
için bir takma addır _.assign
, bu yüzden aynıdırlarnull
aynı şekilde_.defaults
ve _.defaultsDeep
argümanları diğerlerine göre ters sırada işler (ilk argüman hala hedef nesne olsa da)_.merge
ve _.defaultsDeep
alt nesneler birleştirilecek ve diğerleri kök seviyesinde üzerine yazılır_.assign
ve _.extend
ile bir değerin üzerine yazılırundefined
_.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
kolları undefined
ama diğerleri atlayacak_.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
aynı şekilde_.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
ve _.defaultsDeep
alt nesneleri birleştirir_.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" }
Not: @Mistic'in işaret ettiği gibi, Lodash dizilere anahtarların dizinin dizini olduğu nesneler gibi davranır.
_.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
ile çatışmalarOnly _.assign will overwrite a value with undefined
Dikkat edilmesi gereken bir diğer fark undefined
değerlerin işlenmesidir :
mergeInto = { a: 1}
toMerge = {a : undefined, b:undefined}
lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}
lodash.merge({}, mergeInto, toMerge) // => {a: 1, b:undefined}
Böylece değerleri tanımlı değerlerle merge
birleştirmeyeceğiz undefined
.
mergeInto
sahip olmayan özellikler toMerge
olsaydı bu özellikleri koruyacaktı. Bu durumda bir klon olmazdı.
Semantik bir bakış açısıyla yaptıklarını düşünmek de yararlı olabilir:
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.
Bu yöntemleri semantik açıdan düşünmeyi öğrenmenin, mevcut ve mevcut olmayan değerlerin tüm farklı senaryoları için nasıl bir davranış olacağını daha iyi "tahmin etmenizi" sağlayacağına inanıyorum.