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

JavaScript

理查德Itachi

2020-03-13

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

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

第1443篇《Lodash-.extend()/ .assign()和.merge()之间的区别》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

4个回答
樱小胖 2020.03.13

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

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

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

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

逆天LEY 2020.03.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合并为定义的值。

泡芙小卤蛋Tom 2020.03.13

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

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

神奇飞云 2020.03.13

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

_。分配

   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.

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

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android