具有多种功能的Lodash过滤器

时间:2017-12-13 22:47:07

标签: javascript filter lodash code-readability

试图找出最简洁的方法来执行以下操作:

我正在过滤一些结果两次,而我正在使用Lodash过滤器这样做。目前,我的代码如下:

resultsOne = _.filter(results, functionOne);
resultsTwo = _.filter(resultsOne, functionTwo);

我意识到我可以将functionOne和functionTwo结合起来,但我喜欢将它们拆开以便于阅读。有两种函数过滤的最佳实践,使用Lodash还是普通的'Javascript?

谢谢!

3 个答案:

答案 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,它将任意数量的谓词组成一个过滤谓词。