W bibliotece Lodash ktoś może lepiej wyjaśnić scalenie i rozszerzenie / przypisanie .
To proste pytanie, ale mimo wszystko odpowiedź mnie omija.
źródło
W bibliotece Lodash ktoś może lepiej wyjaśnić scalenie i rozszerzenie / przypisanie .
To proste pytanie, ale mimo wszystko odpowiedź mnie omija.
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)
Wersja Lodash 3.10.1
Porównywane metody
_.merge(object, [sources], [customizer], [thisArg])
_.assign(object, [sources], [customizer], [thisArg])
_.extend(object, [sources], [customizer], [thisArg])
_.defaults(object, [sources])
_.defaultsDeep(object, [sources])
Podobieństwa
_.extend
jest pseudonimem_.assign
, więc są identycznenull
to samoRóżnice
_.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
Testy
Wszystkie obsługują członków u podstawy w podobny sposób.
_.assign
uchwyty,undefined
ale inni to pominąWszystkie działają
null
tak samoAle tylko
_.merge
i_.defaultsDeep
połączy obiekty potomneI wydaje się, że żadne z nich nie połączy tablic
Wszystkie modyfikują obiekt docelowy
Żaden tak naprawdę nie działa zgodnie z oczekiwaniami na tablicach
Uwaga: Jak wskazał @Mistic, Lodash traktuje tablice jako obiekty, w których klucze są indeksem tablicy.
źródło
_.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:Więc
merge
nie scaliundefined
wartości w zdefiniowane wartości.źródło
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:
_.przydzielać
_.łączyć
_.defaults
_.defaultsDeep
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.
źródło
Jeśli chcesz głębokiej kopii bez przesłonięcia, zachowując to samo
obj
odniesienieobj = _.assign(obj, _.merge(obj, [source]))
źródło