Lodash 创建自定义函数的方式

Lodash way of creating a custom function

我正在尝试以纯 lodash 方式实现一个简单的功能。

function forward(i) => {
  return (j) => {
    return String.fromCharCode(i + j)
  }
}

这样我就可以做到_.range(26).map(forward(65))。花点时间完成这项工作:

function a = _.wrap(String.fromCharCode, (fn, a, b) => fn(a + b))
function b = _.ary(a, 2)
function forward = _.curry(b)

现在我的问题是有没有更简单的方法来做到这一点?以及如何使用 sum 构造 (fn, a, b) => fn(a + b)?

最后一件事是我在 Lodash 存储库中找不到包装函数文件。

函数_.curry(...)在调用带有各种参数的函数时有点奇怪。让我用下面的例子来指导你。

ary 函数 (_.ary(..., 2)) 接受任何函数并确保它永远不会使用超过特定数量的参数(在本例中为两个)调用。少于指定的参数,最终将以更少的参数调用底层函数。此函数的定义可能如下所示:

function ary() {
    const args = arguments;

    // implementation
}

没有办法告诉函数需要多少个参数,就像使用带有实际参数的函数 (function(a, b) { }) 一样。如果你定义 const forward1 = _.curry(_.ary(target, 2)),并用 forward1(42)(2) 调用它,curry 函数会在它认为完成时将第一个参数传递给 ary

我们可以通过使用 curry 的重载来解决这个问题,该重载指定底层函数期望的参数数量 (const forward2 = _.curry(target, 2))。只有在 forward2 以 curry 风格(不确定它甚至叫什么)用两个参数调用的情况下,它才会将它传递给 target。带有一个参数的调用只会 return 一个新函数,等待使用第二个参数调用它。现在我们可以去掉 ary-call,因为它不再对我们有用。


至于链接操作,有一个帮手。例如:c(b(a(...)可以改写为_.flow([a, b, c])。 Lodash 还提供了 a + b 的函数,即 _.add().


一起你的问题可以重写为:

const forward = _.curry(_.flow([_.add, String.fromCharCode]), 2);

或更详细:

const methods = _.flow([
    _.add,
    String.fromCharCode
]);

const forward = _.curry(methods, 2);

请注意,2 对应于 _.add 方法期望的参数数量。