Ramda 函数用于使用参数调用对象的方法?

Jay*_*enu 1 javascript ramda.js

Ramda.js 是否有可用于调用对象方法的函数?基本上相当于这个:

(methodName, argumentList) => o => o[methodName].apply(o, argumentList);
Run Code Online (Sandbox Code Playgroud)

我已经浏览了函数列表几次,但没有发现任何似乎可以做到这一点的东西。

Ori*_*ori 5

您可以将 R.invoker 与 R.apply 结合使用来获得您想要的东西。然而,正如您所看到的,它有点笨拙并且不那么可读:

const { curry, apply, invoker, length } = R

const fn = curry((methodName, argumentList) =>
  apply(invoker(length(argumentList), methodName))(argumentList)
)

const slice = fn('slice', [1, 4])

const result = slice('abcdefghijklm')

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
Run Code Online (Sandbox Code Playgroud)

通过 Vanilla JS 使用 spread,该函数变得更简单且更具可读性:

const fn = (methodName, argumentList) => o => o[methodName](...argumentList)

const slice = fn('slice', [1, 4])

const result = slice('abcdefghijklm')

console.log(result);
Run Code Online (Sandbox Code Playgroud)

您还可以柯里化普通函数:

const fn = R.curry((methodName, argumentList, o) => o[methodName](...argumentList))

const slice = fn('slice', [1, 4])

const result = slice('abcdefghijklm')

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
Run Code Online (Sandbox Code Playgroud)