试图找出最简洁的方法来执行以下操作:
我正在过滤一些结果两次,而我正在使用Lodash过滤器这样做。目前,我的代码如下:
resultsOne = _.filter(results, functionOne);
resultsTwo = _.filter(resultsOne, functionTwo);
我意识到我可以将functionOne和functionTwo结合起来,但我喜欢将它们拆开以便于阅读。有两种函数过滤的最佳实践,使用Lodash还是普通的'Javascript?
谢谢!
答案 0 :(得分:4)
使用lodash
您可以使用_.overEvery()
创建过滤功能,并在过滤器中使用它:
var ff = _.overEvery([functionOne, functionTwo]);
var filteredResults = results.filter(ff)
Vanilla JS
创建一个过滤函数数组,并使用Array#every将它们应用于值:
var filters = [functionOne, functionTwo];
filterdResults = results.filter(function(item) {
return filters.every(function(ff) {
return ff(item);
});
});
答案 1 :(得分:2)
results.filter(functionOne).filter(functionTwo);
答案 2 :(得分:2)
您可以使用Lodash将这两个过滤器链接在一起,使用_(…)
constructor或更正确的包装:
let filtered = _(results).filter(functionOne).filter(functionTwo).value()
_(…)
包装器包装一个值,在这种情况下是数组,并允许它与其他函数链接,例如_.filter
。该数组将作为要过滤的数组传递,并将该函数作为谓词传递。最后的value()
电话会打开价值。
当然,使用ES5,这个操作变得非常简单,Lodash会造成不必要的混乱:
let filtered = results.filter(functionOne).filter(functionTwo);
这减少了内置方法对库的依赖性,并且在没有包装器的情况下很容易链接。
你甚至可以使用vanilla JavaScript来组合它们:
let filtered = results.filter(result => functionOne(result) && functionTwo(result))
这将检查这两个功能。这类似于Ori Diori建议的_.overEvery
,它将任意数量的谓词组成一个过滤谓词。