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

为什么Lodash包装器不适用于forEach?

万俟财
2023-03-14

我在更新链式lodash操作时遇到了这个问题,我不明白为什么会有不同的效果

我把范围缩小到用链子把一根forEach拴在一个lodash包装纸上

let tab = [{a:1, b:1}, {a:1, b:2}, {a:2, b:1},{a:2, b:2}]
let res = _(tab).forEach(el => {el.c = 3; return el;}).groupBy('a')
console.log(res)

https://jsbin.com/wahokezeja/edit?js,控制台

这将抛出一个错误:

“TypeError:\(…)。forEach(…)。groupBy不是一个函数

但是,当使用贴图链接时,效果很好

let tab = [{a:1, b:1}, {a:1, b:2}, {a:2, b:1},{a:2, b:2}]
let res = _(tab).map(el => {el.c = 3; return el;}).groupBy('a').value()
console.log(res)

https://jsbin.com/mofusel/1/edit?js,控制台

它与_(tab)有关。for每个返回一个数组,而不是洛迪什包装器,但不明白为什么会这样。

共有1个答案

范成周
2023-03-14

[代码][代码]_. map([1,2,3], a=

请尝试以下操作:

var arr=[1,2,3]; 
var rslt=_(arr).forEach(v=>v*2); 
console.log(arr===rslt);

您可以看到它返回true——来自foreach的“结果”,无论包装与否,都只是原始数组。

在深入研究lodash代码和@VLAZ的一些有用注释之后,理解这一点的关键是与链接相关联的惰性计算(这是上面提到的数组包装点)。(包装的)链式方法支持延迟计算。如果调用\(数组)。地图(fn1)。map(fn2)。value()则在调用value方法之前不会进行求值。这是一个很好的效率提升,因为(在本例中)只生成一个输出数组(与标准JS map方法不同,它会在每个步骤后生成中间数组)。然而,forEach是不同的,它需要立即执行,因此它结束了链。

 类似资料:
  • 为什么JSF2/Facelet的ui:repeat不接受java。util。迭代器的值?可以在迭代器后面隐藏如此多的实现和内存节约,因为长度不需要知道,所以拥有它是非常有用的。但是相反,我需要将迭代器转换为列表,并抛弃所有优点,以便ui:repeat。 可能有阶段、时间或可序列化的原因,但我对可用文档的浏览并没有给出这些原因。我们还没有使这一不可能成为可能的科学吗?

  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

  • 问题内容: 假设我有这个模型: 现在,如果我想高效地查看相册中的一部分照片。我这样做是这样的: 这只会执行两个查询,这正是我所期望的(一个查询得到相册,然后一个查询,例如“ SELECT * IN photos WHERE photoalbum_id IN()”。 一切都很棒。 但是,如果我这样做: 然后用!进行大量查询!我是在做错什么,还是django不够聪明,以至于它已经获取了所有照片并可以在

  • 来自Gradle的文档: 此任务生成的脚本将提交给您的版本控制系统。该任务还生成一个小的gradle-wrapper.JAR引导程序JAR文件和属性文件,这些文件也应该提交给VCS。脚本委托给这个jar。 来自:什么不应该受到源头控制?

  • 我一直在收到com。谷歌。格森。JsonSyntaxException无法调用Gson。fromJson(),因此添加了一个捕获(异常)逻辑,但错误永远不会被捕获,而只是被抛出! 这是我所拥有的: 运行测试时,我得到“com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应为BEGIN\u对象,但在第1行第1列路径$

  • 这是一个使用ValArray的简单c程序: 如果我像这样编译并运行它: 产出如预期: 但是,如果我像这样编译和运行它: 输出为: 如果使用优化参数,也会发生同样的情况。 GCC版本是(Archlinux最新版本): 但是,如果我尝试叮当,两者 和 产生相同的正确结果: clang版本是: 我还尝试了在Debian上使用GCC 4.9.2,其中可执行文件会产生正确的结果。 这是GCC中可能存在的错误