javascript - 在 JavaScript 中将方法用作(curried)函数

标签 javascript underscore.js lodash ramda.js

<分区>

将方法转换为柯里化(Currying)函数的最优雅方法是什么?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'

最佳答案

您可以轻松地为具有任意数量的方法扩展您的方法:

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这似乎正是您要找的。

关于javascript - 在 JavaScript 中将方法用作(curried)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25788790/

相关文章:

javascript - Leafletjs - 数组中存在传单点

javascript - 如何在数组中迭代两次

javascript - 如何对受控输入进行去抖处理?

javascript - 返回嵌套数组的前两个索引的更简单方法?

javascript - D3 条形图 - 如何一起显示正值/负值?

javascript - 数组和嵌套子数组中的 lodash 属性搜索

javascript - 在 Ios 设备上强制播放音频

javascript - 如何一起提升和组合功能?

javascript - Jasmine expect toThrow 不传也不接

javascript - 使不可见的 div 在单击时变为可见不起作用