当前位置: 首页 > 知识库问答 >
问题:

Lodash-extend()/.assign()和.merge()之间的差异

安坚诚
2023-03-14

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

这是一个简单的问题,但我还是没有回答。

共有3个答案

景建业
2023-03-14

另一个需要注意的区别是处理未定义的值:

mergeInto = { a: 1}
toMerge = {a : undefined, b:undefined}
lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}
lodash.merge({}, mergeInto, toMerge)  // => {a: 1, b:undefined}

因此,合并不会将未定义的值合并为定义的值。

轩辕煜
2023-03-14
  • _合并(对象,[源代码],[定制器],[thisArg])
  • _。
  • _扩展(对象,[源代码],[定制器],[thisArg])
  • _默认(对象,[源])
  • _。
  • 它们中没有一个能像您预期的那样在阵列上工作
  • .defaults.defaultsDeep以与其他参数相反的顺序处理参数(尽管第一个参数仍然是目标对象)
_.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      ({}, { 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" }
_.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 }
_.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"  ]

那博瀚
2023-03-14

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

以下是merge的工作原理:对于源代码中的每个属性,检查该属性是否为对象本身。如果是,则递归地向下,并尝试将子对象属性从源映射到目标。因此,本质上我们将对象层次结构从源合并到目标。而对于扩展/分配,它是从源到目标的简单的一级属性副本。

下面是一个简单的JSBin,它将使这一点非常清楚:http://jsbin.com/uXaqIMa/2/edit?js安慰

这里有更详细的版本,在示例中也包括数组:http://jsbin.com/uXaqIMa/1/edit?js,控制

 类似资料:
  • 问题内容: 在Lodash库中,有人可以更好地解释合并和扩展/分配。 这是一个简单的问题,但答案仍然使我回避。 问题答案: 下面是如何/作品:对于源的每个属性,复制其价值,是到目的地。如果属性值本身是对象,则不会对其属性进行递归遍历。整个对象将从源中获取并设置到目标中。 下面是如何工作的:对于源的每个属性,检查如果该属性是对象本身。如果是,则递归关闭并尝试将子对象属性从源映射到目标。因此,实质上,

  • 本文向大家介绍Lodash库中.extend()/ .assign()和.merge()之间的区别。,包括了Lodash库中.extend()/ .assign()和.merge()之间的区别。的使用技巧和注意事项,需要的朋友参考一下 分配/扩展采用源中的每个属性,将其值原样复制到目标。如果属性值本身是对象,则不会对其属性进行递归遍历。这也称为浅复制/克隆。整个对象将从源中取出并放入目的地。 合并

  • 和? 到目前为止,这是我发现的,请评论我的理解是否完整和准确: > 只能使用列(加上行索引),并且它在语义上适合于数据库风格的操作。可以与任一轴一起使用,只使用索引,并且提供了添加一个分级索引。 顺便说一下,这允许以下冗余:两者都可以使用行索引组合两个数据帧。 只提供了 (Pandas擅长处理数据分析中非常广泛的用例。探索文档以找出执行特定任务的最佳方式可能有点令人生畏。)

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 去年关闭。 为什么有人会比其他人更喜欢lodash.js或underscore.js实用程序库? Lodash似乎是下划线的替代品,下划线的使用时间更长。 我认为两者都很出色,但是我对它们的工作方式还不甚了解,无法进行有根据的比较,我想进一步了解它们之间的差异。

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?