如何组合函数以便内部应用程序隐式接收外部参数?

时间:2014-12-16 19:24:23

标签: javascript ramda.js

编辑:我已将此标记为Can I make this function defenition [sic] even shorter?的副本,其功能相同(两个双关语意图)且答案很好来自Ramda图书馆的一位作者。

这是一个学术好奇而不是实际需要的问题。

我正在试用Ramda图书馆,该图书馆强调了一个免费的#34;功能构成的风格。

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

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)); }

结果是"咖喱"函数,因此byIdRam('c')(things)给出与第一个版本相同的结果。

我觉得剩下的lambda也是不必要的,但我不知道如何在没有明确引用id的情况下编写函数。有没有人知道更好的方法来写这个?

更新答案就是

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

这也给出了我想要的语义,它返回单个元素或undefined。尼斯!

1 个答案:

答案 0 :(得分:0)

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

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;

};