【问题标题】:Create chain in lodash with custom functions使用自定义函数在 lodash 中创建链
【发布时间】:2014-01-16 13:48:53
【问题描述】:

有没有办法在lodash链中获得我自己的自定义函数。所以例如像这样:

var l = [1,2,3]
var add = function(a, b){return a+b}

var r =_.chain(l).find(function(a){return a>1}).add(5).value()

=>r = 7

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    您寻找的是一种扩展 lodash 原型的方法。事实证明,您可以使用 mixin 实用程序函数轻松完成。在此处查看文档: http://lodash.com/docs#mixin

    在您的示例中,它将如下所示:

    var l = [1,2,3];
    var  add = function(a, b){return a+b}
    
    
    _.mixin({
        add: add 
    });
    
    
    var r =_.chain(l).find(function(a){return a>1}).add(5).value()
    console.log(r); ==> 7
    

    这是小提琴上的现场样本:http://jsfiddle.net/g2A9C/

    【讨论】:

      【解决方案2】:

      在@stride anwswer 之后,我想出了一个使用_.mixin 的更通用的解决方案:

      function add(a, b, c) {
        return a + b + c
      }
      
      function sub(a, b, c) {
        return a - b - c
      }
      
      _.mixin({
        run: function (v, f) {
          var args = Array.prototype.slice.call(arguments, 2)
          args.unshift(v)
          return f.apply(this, args)
        }
      })
      var r = _.chain(1).run(add, 1, 1).run(sub, 2, 2).value()
      
      console.log(r) ->  -1
      1 + 1 + 1 - 2 - 2 = -1
      

      http://jsbin.com/iyEhaMa/1/

      毕竟我想知道为什么这不是 lodash 中的内置函数。

      【讨论】:

      • 使用内置函数可以通过多种方式完成此操作,包括_.map 和必要时组合_.partial:`_(arr).map(_.partial(add, _, 1))
      【解决方案3】:

      另一种选择是通过_.flow 删除链接并利用函数组合。

      来自文档:

      [Flow] 创建一个返回调用给定结果的函数 函数与创建函数的 this 绑定,其中每个 为连续调用提供前一个的返回值。

      这意味着 Flow 中的每个函数都将接收前一个函数的输出作为输入。在实践中,这意味着我们不仅限于使用 Lodash API 方法,而是可以混合搭配我们喜欢的任何函数,只要下一个能够处理该返回值即可。

      var l = [1,2,3]
      var add = _.curry((a, b) => a + b);
      
      _.flow(
        _.find(a => a > 1),
        add(5),
      )(l);
      
      // => 7
      

      注意 - 此示例使用的是功能版本的 Lodash,如果您不想要或不能使用该版本,您仍然可以获得相同的结果,请查看 my other answer to another question about Lodash

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 2021-06-14
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多