过滤多个谓词,优雅的功能方法

时间:2014-09-25 23:28:27

标签: javascript functional-programming underscore.js lodash ramda.js

我试图在我的应用中实现过滤逻辑。有一个表格,每个列标题都包含一个输入字段和带有过滤器选项的下拉列表,您可以通过选择一个选项来设置过滤器,例如"等于","不等于","以"开头,"包含","不包含" ,"以"等结束(选项会因不同类型的数据而改变)。类似于KendoUI grid

的东西

现在我能解决的问题是如何使用所选过滤器的谓词创建一个过滤数据数组的函数(可以设置多个过滤器)

我刚开始使用ramda.js,我认为该项目非常棒。我想我可以使用那个或lodash /下划线(我更喜欢ramda)

如果有人可以给我看一个片段,那么首先要做的事情 - 我会非常感激

3 个答案:

答案 0 :(得分:5)

我认为您正在寻找R.allPass功能。你只需要做

var selectedPredicates = …;
R.filter(R.allPass(selectedPredicates))(list)

答案 1 :(得分:1)

如果你的意思是我的意思,我不完全清楚,所以这是我的假设:

  • 您有一些类型为t的谓词列表,即[t -> Bool]类型的
  • 并且您希望退出一个谓词,如果列表中所有谓词的连接保留其输入,则为真。

然后你可以使用一个带有提升连词运算符的折叠和一个不断真实的基本情况(带有一个空列表,“全部”谓词平凡地保持)。这个Haskell代码有效:

> let f = foldr (\f g -> \x -> f x && g x) (const True) [(>2), (<=10)]
> f 5
True
> f 1
False

使用JS和ramda,f可能看起来像这样(未经测试):

var f = R.reduce(function(f, g) { 
                   return function(x) { return f(x) && g(x); };
                 },
                 alwaysTrue,
                 your_actual_predicates);

答案 2 :(得分:0)

const moreThan2 = n => n > 2;
const lessThan5 = n => n < 5;

const filtered = [1, 2, 3, 4, 5]
  .filter(n => [moreThan2, lessThan5].every(pred => pred(n)));

console.log(filtered); // [3,4]