编辑:我已将此标记为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
。尼斯!
答案 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;
};