【问题标题】:Lodash Filter with Multiple Functions具有多种功能的 Lodash 过滤器
【发布时间】:2017-12-13 22:47:07
【问题描述】:

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

我对一些结果进行了两次过滤,我正在使用 Lodash 过滤器来执行此操作。目前,我的代码如下所示:

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

我意识到我可以将 functionOne 和 functionTwo 结合起来,但我喜欢将它们分开以提高可读性。是否有使用 Lodash 或纯 Javascript 进行过滤的两个函数的最佳实践?

谢谢!

【问题讨论】:

    标签: javascript filter lodash code-readability


    【解决方案1】:

    使用 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);
      });
    });
    

    【讨论】:

      【解决方案2】:

      大概是这样的吧?

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

      【讨论】:

        【解决方案3】:

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

        let filtered = _(results).filter(functionOne).filter(functionTwo).value()
        

        _(…) 包装器包装了一个值,在本例中为数组,并允许将其与其他函数链接,例如 _.filter。数组将作为要过滤的数组传递,函数作为谓词传递。最后的 value() 调用会解开该值。

        当然,在 ES5 中,这个操作变得极其琐碎,而 Lodash 会造成不必要的混乱:

        let filtered = results.filter(functionOne).filter(functionTwo);
        

        这减少了内置方法对库的依赖,并且无需包装即可轻松链接。

        您甚至可以使用原生 JavaScript 来组合它们:

        let filtered = results.filter(result => functionOne(result) && functionTwo(result))
        

        这会检查两个函数。这类似于 Ori Diori 建议的 _.overEvery,它将任意数量的谓词组合成一个过滤谓词。

        【讨论】:

          猜你喜欢
          • 2016-03-07
          • 1970-01-01
          • 1970-01-01
          • 2013-09-18
          • 2017-02-16
          • 2021-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多