W bibliotece Lodash ktoś może lepiej wyjaśnić scalenie i rozszerzenie / przypisanie .
To proste pytanie, ale mimo wszystko odpowiedź mnie omija.
W bibliotece Lodash ktoś może lepiej wyjaśnić scalenie i rozszerzenie / przypisanie .
To proste pytanie, ale mimo wszystko odpowiedź mnie omija.
Odpowiedzi:
Oto jak extend
/ assign
działa: Dla każdej właściwości w źródle skopiuj jej wartość „jak jest” do miejsca docelowego. jeśli same wartości właściwości są obiektami, nie następuje rekurencyjne przechodzenie ich właściwości. Cały obiekt zostanie pobrany ze źródła i ustawiony w miejscu docelowym.
Oto jak merge
działa: Dla każdej właściwości w źródle sprawdź, czy ta właściwość jest samym obiektem. Jeśli tak, to rekurencyjnie zejdź w dół i spróbuj zmapować właściwości obiektu potomnego ze źródła do miejsca docelowego. Zasadniczo łączymy hierarchię obiektów od źródła do miejsca docelowego. W przypadku extend
/ assign
jest to prosta, jednopoziomowa kopia właściwości od źródła do miejsca przeznaczenia.
Oto prosty JSBin, który uczyni to krystalicznie czystym: http://jsbin.com/uXaqIMa/2/edit?js,console
Oto bardziej rozbudowana wersja, która zawiera również tablicę w tym przykładzie: 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
jest pseudonimem _.assign
, więc są identycznenull
to samo_.defaults
i _.defaultsDeep
przetwarza argumenty w odwrotnej kolejności niż inne (chociaż pierwszy argument jest nadal obiektem docelowym)_.merge
i _.defaultsDeep
połączy obiekty potomne, a pozostałe nadpiszą na poziomie głównym_.assign
i _.extend
nadpisze wartość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
uchwyty, undefined
ale inni to pominą_.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
tak samo_.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
i _.defaultsDeep
połączy obiekty potomne_.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" }
Uwaga: Jak wskazał @Mistic, Lodash traktuje tablice jako obiekty, w których klucze są indeksem tablicy.
_.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
wchodzi w konflikt zOnly _.assign will overwrite a value with undefined
Inną różnicą, na którą należy zwrócić uwagę, jest obsługa undefined
wartości:
mergeInto = { a: 1}
toMerge = {a : undefined, b:undefined}
lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}
lodash.merge({}, mergeInto, toMerge) // => {a: 1, b:undefined}
Więc merge
nie scali undefined
wartości w zdefiniowane wartości.
mergeInto
miał właściwości, toMerge
których nie miał, zachowałby te właściwości. W takim przypadku nie byłby to klon.
Pomocne może być również rozważenie tego, co robią z semantycznego punktu widzenia:
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.
Wierzę, że nauka myślenia o tych metodach z semantycznego punktu widzenia pozwoliłaby lepiej „odgadnąć”, jakie byłoby zachowanie dla wszystkich różnych scenariuszy wartości istniejących i nieistniejących.