我有以下使用lodash编写的工作代码,最新版本
_.forEach(_.filter($ctrl.data, ['x', 'y']), function (elem) {
...
});
如果我尝试将其转换为链,它将永远不会执行forEach
内的块代码。
_.chain($ctrl.data)
.filter(['x', 'y'])
.forEach(function (elem) {
...
});
为什么?
答案 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