3

我正在尝试在我的应用程序中实现过滤逻辑。有一个表格,每个列标题都包含一个输入字段和带有过滤器选项的下拉列表,您可以通过选择一个选项来设置过滤器,例如“等于”、“不等于”、“开始于”、“包含”、“不”包含”、“结束于”等(选项会因不同类型的数据而变化)。类似于KendoUI 网格的东西

现在我无法理解的是如何创建一个函数,通过使用选定过滤器的谓词来过滤数据数组(可以设置多个过滤器)

我刚开始使用ramda.js,我认为这个项目真的很棒。我想我可以使用它或 lodash/underscore (虽然我更喜欢 ramda)

如果有人可以给我看一个片段,一些开始的东西 - 我将非常感激

4

3 回答 3

7

我认为您正在寻找该R.allPass功能。你会做

var selectedPredicates = …;
R.filter(R.allPass(selectedPredicates))(list)
于 2014-09-27T10:50:31.317 回答
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);
于 2014-09-27T10:26:23.317 回答
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]

于 2021-08-03T09:34:57.353 回答