为了账号安全,请及时绑定邮箱和手机立即绑定

Lodash-.extend()/ .assign()和.merge()之间的区别

Lodash-.extend()/ .assign()和.merge()之间的区别

千万里不及你 2019-11-21 13:03:08
在Lodash库中,有人可以更好地解释合并和扩展/分配。这是一个简单的问题,但答案仍然使我回避。
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

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      ({}, { 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所指出的,Lodash将数组视为对象,其中键是数组的索引。


_.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"  ]


查看完整回答
反对 回复 2019-11-21
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

要注意的另一个区别是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值合并为定义的值。


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 778 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信