[英]lodash - chaining filter and forEach
我有以下用 lodash 编写的工作代码,最新版本
_.forEach(_.filter($ctrl.data, ['x', 'y']), function (elem) {
...
});
如果我尝试将其转换为链,它将永远不会执行forEach
的块代码。
_.chain($ctrl.data)
.filter(['x', 'y'])
.forEach(function (elem) {
...
});
为什么?
我通过使用_($ctrl.data)
而不是_.chain($ctrl.data)
解决了这个问题。 我读到这里的主要区别在于 lodash 的全局函数在末尾具有“终止函数”时调用_.value()
。
使用_.chain
的等效方法是在_.value()
之前显式调用_.forEach()
。 但仍然无法弄清楚是什么问题,因为在我看来, forEach
是一个“终止函数”。
我刚刚遇到了类似的问题。 我正在使用_(blah)
语法,但仍然遇到问题。
就我而言,代码如下所示:
_(items).forEach((x) => doSomething(x));
事实证明doSomething
正在返回一个boolean
。 我猜 lodash 看到了这个返回值并将forEach
与map
一样对待,而不是评估它。 但是,我尝试将value()
附加到最后,并且在运行时得到一个value is not a function
错误。
就我而言,问题是通过包装doSomething
调用解决的:
_(items).forEach((x) => { doSomething(x); });
看起来更像是一个错误而不是任何东西。
发生这种情况是因为 lodash 中链式方法的执行是惰性的。
来自关于序列的 lodash 文档:
链式方法的执行是惰性的,也就是说,它被推迟到 _#value 被隐式或显式调用。
这意味着以下代码:
_.chain(['a','b','c'])
.filter(_.stubTrue)
.forEach(i => console.log(i))
除非序列以value()
结束,否则不会向控制台打印任何内容:
_.chain(['a','b','c'])
.filter(_.stubTrue)
.forEach(i => console.log(i))
.value()
a
b
c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.