编辑:我已将其标记为 Can I make this function defenition even shorter? 的重复项,它在功能上相同(两个双关语),并且从作者之一那里得到了很好的答案Ramda 库。
这是一个更多出于学术好奇心而非实际需要的问题。
我正在尝试 Can I make this function defenition [sic] even shorter? 库,它强调“无点”函数组合风格。
假设我有一个对象数组,例如
var things = [
{id: "a", value: 234},
{id: "b", value: 345},
{id: "c", value: 456}
]
我想要一个函数来按 id 返回元素(或者至少目前是按 id 匹配的列表)。在 native 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)); }
结果是一个“柯里化(Currying)”函数,因此 byIdRam('c')(things)
给出与第一个版本相同的结果。
我感觉剩下的 lambda 也是不必要的,但我不知道如何在不显式引用 id 的情况下编写函数。有谁知道更好的写法吗?
更新答案很简单
var byId = R.useWith(R.find, R.propEq('id'))
这也给出了我想要的语义,它返回单个元素或 undefined
。不错!
最佳答案
如果我猜对了,你需要这样的东西:
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;
};
关于javascript - 如何编写函数以便内部应用程序隐式接收外部参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27512340/