具有多种功能的 Lodash 过滤器

Lodash Filter with Multiple Functions

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

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

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

我意识到我可以组合 functionOne 和 functionTwo,但我喜欢将它们分开以便于阅读。使用 Lodash 或普通 ol' Javascript?

是否有使用两个函数进行过滤的最佳实践

谢谢!

使用 lodash

您可以使用 _.overEvery() 创建过滤函数,并在过滤器中使用它:

var ff = _.overEvery([functionOne, functionTwo]);

var filteredResults = results.filter(ff)

原版 JS

创建一个过滤函数数组,并使用 Array#every:

将它们应用于一个值
var filters = [functionOne, functionTwo];

filterdResults = results.filter(function(item) {
  return filters.every(function(ff) {
    return ff(item);
  });
});

也许是这样的?

results.filter(functionOne).filter(functionTwo);|

您可以使用 Lodash 将这两个过滤器与 _(…) constructor 链接在一起,或者更准确地说,wrapper:

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,后者将任意数量的谓词组合成单个过滤谓词。