1

编辑:我已将其标记为Can I make this function defenition [sic] 的副本更短?,它在功能上是相同的(两个双关语),并且从 Ramda 库的一位作者那里得到了很好的回答。

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

我正在试用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'))

这也给出了我想要的语义,它要么返回单个元素,要么返回undefined. 好的!

4

1 回答 1

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;

};
于 2014-12-16T19:37:06.577 回答