Ramda.js有没有一个函数可以用来调用一个对象的方法?基本上相当于这个。
(methodName, argumentList) => o => o[methodName].apply(o, argumentList);
我在函数列表里找了好几遍 也没有找到任何可以这样做的函数。
你可以使用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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
使用香草JS的spread,功能变得更简单,更易读。
const fn = (methodName, argumentList) => o => o[methodName](...argumentList)
const slice = fn('slice', [1, 4])
const result = slice('abcdefghijklm')
console.log(result);
你也可以用香草函数来做咖喱。
const fn = R.curry((methodName, argumentList, o) => o[methodName](...argumentList))
const slice = fn('slice', [1, 4])
const result = slice('abcdefghijklm')
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>