【问题标题】:Filter with multiple predicates, elegant functional approach使用多个谓词进行过滤,优雅的函数式方法
【发布时间】:2014-11-20 21:15:43
【问题描述】:

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

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

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

如果有人可以给我看一个sn-p,我会很感激的。

【问题讨论】:

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


    【解决方案1】:

    我认为您正在寻找 R.allPass 函数。你只需这样做

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

    【讨论】:

    • 嗯,它看起来确实像我需要的。谢谢,我试试看
    • 哇... ramda 太棒了!我创建了像 R.curry (val, col, data)-> data[col] == val 这样的谓词并将 R.allPredicates 与过滤器一起使用,效果很好。谢谢
    • @JemiloII:是的,尽管他们已经更改了文档 url 和函数名称 :-)
    【解决方案2】:

    我不完全清楚你的意思是不是我认为你所做的,所以这是我的假设:

    • 你有一个关于某种类型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);
    

    【讨论】:

      【解决方案3】:

      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]

      【讨论】:

      • 考虑在您的答案中添加更多解释,以帮助用户了解更多
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2019-05-09
      • 2019-10-24
      相关资源
      最近更新 更多