这是一个简单的问题,但答案仍然使我回避。
Lodash-.extend()/ .assign()和.merge()之间的区别
要注意的另一个区别是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
值合并为定义的值。
如果你想有一个深拷贝没有覆盖同时保持相同的obj
参考
obj = _.assign(obj, _.merge(obj, [source]))
从语义的角度考虑它们的作用可能也会有所帮助:
_。分配
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)
_.defaults
provides default values for missing values.
so will assign only values for keys that do not exist yet in the source.
_.defaultsDeep
works like _defaults but like merge will not simply copy objects
and will use recursion instead.
我相信,从语义的角度学习这些方法将使您更好地“猜测”现有值和不存在值的所有不同方案的行为。
下面是如何
extend
/assign
作品:对于源的每个属性,复制其价值,是到目的地。如果属性值本身是对象,则不会对其属性进行递归遍历。整个对象将从源中获取并设置到目标中。下面是如何
merge
工作的:对于源的每个属性,检查如果该属性是对象本身。如果是,则递归关闭并尝试将子对象属性从源映射到目标。因此,实质上,我们将对象层次结构从源到目标进行合并。对于extend
/assign
,它是从源到目标的简单一级属性副本。这是一个简单的JSBin,它可以使这一点变得清晰:http ://jsbin.com/uXaqIMa/2/edit?js, console
这是更详细的版本,在示例中还包括数组:http : //jsbin.com/uXaqIMa/1/edit?js,console