将方法转换为curried函数的最优雅方法是什么,并且在Underscore / Lo-dash或Ramda等库中是否支持这种方法?
对于固定数量的参数我现在正在这样做:
var fn2 = _.curry(function (m, a1, a2, obj) {
return obj[m].call(obj, a1, a2);
});
允许使用以下代码:
var a2b = fn2('replace', 'a', 'b')
a2b('abc')
=> 'bbc'
以及:
var nl2_ = fn2('replace', '<br>')
nl2_('\n', 'some<br>html')
=> 'some\nhtml'
答案 0 :(得分:4)
您可以轻松扩展任意方法的方法:
function curryMethod(m, a) {
if (a !== ~~a) a = m.length;
return _.curry(function() {
return m.apply(arguments[a], Array.prototype.slice.call(arguments, 0, -1));
}, a+1);
}
> var replace = curryMethod(String.prototype.replace)
> replace("a", "b", "abc")
"bbc"
> var a2b = replace("a", "b")
> a2b("abc")
"bbc"
由于您也曾询问过Ramda,我只是快速扫描了他们的API,但发现R.invoker
function似乎正是您正在寻找的。 p>