В библиотеке Lodash кто-нибудь может дать лучшее объяснение слияния и расширения / назначения .
Это простой вопрос, но ответ, тем не менее, уклоняется от меня.
источник
В библиотеке Lodash кто-нибудь может дать лучшее объяснение слияния и расширения / назначения .
Это простой вопрос, но ответ, тем не менее, уклоняется от меня.
Вот как extend
/ assign
работает: Для каждого свойства в источнике скопируйте его значение как есть в место назначения. если значения свойств сами по себе являются объектами, рекурсивного обхода их свойств не происходит. Весь объект будет взят из источника и установлен в место назначения.
Вот как это merge
работает: Для каждого свойства в источнике проверьте, является ли это свойство самим объектом. Если это так, то идите рекурсивно вниз и попытайтесь отобразить свойства дочерних объектов от источника к месту назначения. По сути, мы объединяем иерархию объектов от источника к месту назначения. В то время как для extend
/ assign
это простая одноуровневая копия свойств из источника в место назначения.
Вот простой JSBin, который прояснил бы это: http://jsbin.com/uXaqIMa/2/edit?js,console
Вот более сложная версия, которая также включает в себя массив: http://jsbin.com/uXaqIMa/1/edit?js,console
var combined = merge({}, src, dest)
Lodash версия 3.10.1
Методы по сравнению
_.merge(object, [sources], [customizer], [thisArg])
_.assign(object, [sources], [customizer], [thisArg])
_.extend(object, [sources], [customizer], [thisArg])
_.defaults(object, [sources])
_.defaultsDeep(object, [sources])
сходства
_.extend
это псевдоним для_.assign
, поэтому они идентичныnull
одинаковоРазличия
_.defaults
и_.defaultsDeep
обрабатывает аргументы в обратном порядке по сравнению с другими (хотя первый аргумент все еще является целевым объектом)_.merge
а также_.defaultsDeep
объединит дочерние объекты, а остальные перезапишут на корневом уровне_.assign
и_.extend
перезапишет значение сundefined
тесты
Все они обрабатывают членов в корне похожими способами.
_.assign
ручкиundefined
но другие пропустят этоОни все справляются
null
одинаковоНо только
_.merge
и_.defaultsDeep
будут сливать дочерние объектыИ, похоже, никто из них не объединит массивы
Все модифицируют целевой объект
Ни один из них не работает должным образом на массивах
Примечание. Как указывает @Mistic, Lodash рассматривает массивы как объекты, ключи которых являются индексом в массиве.
источник
_.extend is an alias for _.assign, so they are identical
конфликтует сOnly _.assign will overwrite a value with undefined
Еще одно отличие, на которое следует обратить внимание, это обработка
undefined
значений:Так
merge
что не будет объединятьundefined
значения в определенные значения.источник
mergeInto
него были свойства, которых уtoMerge
него не было, он бы сохранил эти свойства. В этом случае это не был бы клон.Также может быть полезно рассмотреть то, что они делают с семантической точки зрения:
_.assign
_.merge
_.defaults
_.defaultsDeep
Я считаю, что изучение этих методов с семантической точки зрения позволит вам лучше «угадать», каково будет поведение для всех различных сценариев существующих и несуществующих ценностей.
источник
Если вы хотите глубокое копирование без переопределения при сохранении той же
obj
ссылкиobj = _.assign(obj, _.merge(obj, [source]))
источник