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

Lodash库中,有人可以更好地解释合并扩展/分配

这是一个简单的问题,但答案仍然使我回避。

樱小胖2020/03/13 16:50:35

下面是如何extend/ assign作品:对于源的每个属性,复制其价值,是到目的地。如果属性值本身是对象,则不会对其属性进行递归遍历。整个对象将从源中获取并设置到目标中。

下面是如何merge工作的:对于源的每个属性,检查如果该属性是对象本身。如果是,则递归关闭并尝试将子对象属性从源映射到目标。因此,实质上,我们将对象层次结构从源到目标进行合并。对于extend/ assign,它是从源到目标的简单一级属性副本。

这是一个简单的JSBin,它可以使这一点变得清晰:http ://jsbin.com/uXaqIMa/2/edit?js, console

这是更详细的版本,在示例中还包括数组:http : //jsbin.com/uXaqIMa/1/edit?js,console

逆天LEY2020/03/13 16:50:35

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

泡芙小卤蛋Tom2020/03/13 16:50:35

如果你想有一个深拷贝没有覆盖同时保持相同的obj参考

obj = _.assign(obj, _.merge(obj, [source]))

神奇飞云2020/03/13 16:50:35

从语义的角度考虑它们的作用可能也会有所帮助:

_。分配

   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.

我相信,从语义的角度学习这些方法将使您更好地“猜测”现有值和不存在值的所有不同方案的行为。