У Lodash бібліотеці, хто - то може забезпечити краще пояснення злиття і розширення / Assign .
Це просте запитання, але відповідь ухиляється від мене.
У Lodash бібліотеці, хто - то може забезпечити краще пояснення злиття і розширення / Assign .
Це просте запитання, але відповідь ухиляється від мене.
Відповіді:
Ось як 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)
_.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 ({}, { 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ручки, undefinedале інші пропустить це_.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однаково_.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і _.defaultsDeepбудуть зливатися дочірні предмети_.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" }
Примітка. Як зазначав @Mistic, Лодаш розглядає масиви як об'єкти, де ключі є індексом масиву.
_.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конфлікти зOnly _.assign will overwrite a value with undefined
Ще одна різниця, на яку слід звернути увагу, - це обробка undefinedцінностей:
mergeInto = { a: 1}
toMerge = {a : undefined, b:undefined}
lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}
lodash.merge({}, mergeInto, toMerge) // => {a: 1, b:undefined}
Таким чином merge, undefinedзначення не буде об'єднано у визначені значення.
mergeIntoбули властивості, яких toMergeне було, вони б зберігали ці властивості. У цьому випадку це не був би клон.
Також може бути корисно розглянути, що вони роблять з семантичної точки зору:
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.
Я вважаю, що навчання думати про ці методи з семантичної точки зору дозволить вам краще «здогадатися», якою буде поведінка для всіх різних сценаріїв існуючих та неіснуючих цінностей.