Javascript 如何组合函数,使内部应用程序隐式接收外部参数?

Javascript 如何组合函数,使内部应用程序隐式接收外部参数?,javascript,ramda.js,Javascript,Ramda.js,编辑:我已将此标记为的副本,它在功能上完全相同(使用两个双关语),并且从Ramda库的一位作者那里得到了一个很好的答案 这是一个更具学术好奇心而非实际需要的问题 我正在试用这个库,它强调函数组合的“无点”风格 假设我有一个对象数组,比如 var things = [ {id: "a", value: 234}, {id: "b", value: 345}, {id: "c", value: 456} ] 我需要一个函数按id返回元素(或者至少目前是按id匹配的列表)。在

编辑:我已将此标记为的副本,它在功能上完全相同(使用两个双关语),并且从Ramda库的一位作者那里得到了一个很好的答案

这是一个更具学术好奇心而非实际需要的问题

我正在试用这个库,它强调函数组合的“无点”风格

假设我有一个对象数组,比如

var things = [
    {id: "a", value: 234},
    {id: "b", value: 345},
    {id: "c", value: 456}
]
我需要一个函数按id返回元素(或者至少目前是按id匹配的列表)。在本机javascript中,我可以说

var byId = function(id, arr) { return arr.filter(function(o) { return o.id === id; }); };
然后,
byId('c',things)
将给我一个数组,其中只包含第三项

在Ramda中,我可以更简洁地做到这一点,而无需参考数据:

var byIdRam = function(id) { return R.filter(R.propEq('id', id)); }
结果是一个“curried”函数,因此
byIdRam('c')(things)
给出了与第一个版本相同的结果

我感觉剩下的lambda也是不必要的,但是我不知道如何在没有显式引用id的情况下编写函数。有人知道更好的编写方法吗

更新答案很简单

var byId = R.useWith(R.find, R.propEq('id'))

这也给出了我想要的语义,它要么返回单个元素,要么返回未定义的
。很好

如果我做对了,你需要这样的东西:

var byIdC = function () {

    var results = things.filter(function (o) {return o.id === "c";})

    return results.length ? results[0] : null;

};
或者使用您的Ramda库:

var byIdC = function () {

    var results = R.filter(R.propEq("id", "c"))(things);

    return results.length ? results[0] : null;

};

是否要创建一个可以像
byId()
那样调用的函数,并返回与
byId('c',things)
相同的函数?@seva.rubbo,是的——至少这与库一致。但是,实际上,我可能希望找到元素,或者返回
null
。为了这个问题,我试图把它考虑清楚。