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])_.extendiçin bir takma addır _.assign, bu yüzden aynıdırlarnullaynı şekilde_.defaultsve _.defaultsDeepargümanları diğerlerine göre ters sırada işler (ilk argüman hala hedef nesne olsa da)_.mergeve _.defaultsDeepalt nesneler birleştirilecek ve diğerleri kök seviyesinde üzerine yazılır_.assignve _.extendile 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" }
_.assignkolları undefinedama 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" }
nullaynı ş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 }
_.mergeve _.defaultsDeepalt 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 identicalile çatışmalarOnly _.assign will overwrite a value with undefined
Dikkat edilmesi gereken bir diğer fark undefineddeğ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 mergebirleştirmeyeceğiz undefined.
mergeIntosahip olmayan özellikler toMergeolsaydı 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.