编辑:我已将其标记为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
. 好的!