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
方法期望的参数数量。
我正在尝试以纯 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
方法期望的参数数量。