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/ assigndział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 mergedział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/ assignjest 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])_.extendjest pseudonimem _.assign, więc są identycznenullto samo_.defaultsi _.defaultsDeepprzetwarza argumenty w odwrotnej kolejności niż inne (chociaż pierwszy argument jest nadal obiektem docelowym)_.mergei _.defaultsDeeppołączy obiekty potomne, a pozostałe nadpiszą na poziomie głównym_.assigni _.extendnadpisze 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" }
_.assignuchwyty, undefinedale 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" }
nulltak 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 }
_.mergei _.defaultsDeeppołą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 identicalwchodzi w konflikt zOnly _.assign will overwrite a value with undefined
Inną różnicą, na którą należy zwrócić uwagę, jest obsługa undefinedwartoś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 mergenie scali undefinedwartości w zdefiniowane wartości.
mergeIntomiał właściwości, toMergektó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.