繁体   English   中英

lodash - 链接过滤器和 forEach

[英]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 看到了这个返回值并将forEachmap一样对待,而不是评估它。 但是,我尝试将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM