lodash - 链接过滤器和forEach

时间:2017-01-25 10:32:49

标签: javascript lodash

我有以下使用lodash编写的工作代码,最新版本

            _.forEach(_.filter($ctrl.data, ['x', 'y']), function (elem) {
                ...
            });

如果我尝试将其转换为链,它将永远不会执行forEach内的块代码。

            _.chain($ctrl.data)
                .filter(['x', 'y'])
                .forEach(function (elem) {
                   ...
                });

为什么?

3 个答案:

答案 0 :(得分:1)

我使用_($ctrl.data)代替_.chain($ctrl.data)修复了问题。我读到这里的主要区别是来自lodash的全局函数在它具有"终止函数时调用_.value()"最后。

使用_.chain的等效内容是在_.value()之前显式调用_.forEach()。但仍然无法弄清楚问题是什么,因为从我的角度来看,forEach是一个"终止函数"。

答案 1 :(得分:1)

我刚遇到类似的问题。我使用的是_(blah)语法,但我仍遇到问题。

就我而言,代码看起来像这样:

_(items).forEach((x) => doSomething(x));

事实证明doSomething正在返回boolean。我想lodash会看到此返回值,并将forEach视为与map相同,而不是评估它。但是,我尝试将value()添加到最后,并在运行时收到value is not a function错误。

就我而言,问题是通过打包doSomething来解决的:

_(items).forEach((x) => { doSomething(x); });

似乎更像是一个错误。

答案 2 :(得分:0)

因为在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