Jay*_*enu 1 javascript ramda.js
Ramda.js 是否有可用于调用对象方法的函数?基本上相当于这个:
(methodName, argumentList) => o => o[methodName].apply(o, argumentList);
Run Code Online (Sandbox Code Playgroud)
我已经浏览了函数列表几次,但没有发现任何似乎可以做到这一点的东西。
您可以将 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)