10

有没有办法在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
4

3 回答 3

17

您要寻找的是一种扩展 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/

于 2014-01-16T14:52:12.247 回答
6

在@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 中的内置函数。

于 2014-01-16T15:31:16.240 回答
4

另一种选择是仅删除链接并通过_.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 的功能版本,如果您不想要或不能使用该版本,您仍然可以获得相同的结果,请查看我对另一个关于 Lodash 的问题的回答

于 2017-07-05T15:14:18.503 回答