javascript - 如何编写函数以便内部应用程序隐式接收外部参数?

标签 javascript ramda.js

编辑:我已将其标记为 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/

相关文章:

javascript - 单词中每个第一个字符和任何大写字母的正则表达式

javascript - 使用 Backbone.js 获取随下拉菜单变化的段落

javascript - 模拟Ramda.path或者lodash库中的

javascript - Easeljs 可滚动容器

javascript - 使用 scrollTop 替换粘性导航栏以获得 60 FPS 性能的替代方案?

javascript .push() 每次插入相同的对象

Javascript Ramda 如何使 R.find(R.propEq()) 不区分大小写?

javascript - 将自定义 Hook 注入(inject) evolve 函数的优雅方式

javascript - Ramda - R.Both 具有采用不同数量参数的函数

javascript - Ramda GroupBy - 如何按任何 Prop 分组