functional-programming - 无积分编程拼图

标签 functional-programming ramda.js

我有一个用匿名函数编写的函数,它会使用对象列表来组合 ID 数组,匹配 id 属性。

const objectsList = [{ id: 1, ... }, { id: 2, ... }]
ids.map(id => R.find(R.propEq('id', id), objectsList))

(我知道以这种方式查找对象很愚蠢——效率低下等等——让我们暂时忽略它。)

所以,我想不加分地做这件事,但我被卡住了。这是最佳尝试:

ids.map(R.find(R.propEq('id', R.__), objects))

但这并不好。我还尝试翻转参数的顺序并使用 compose,但这没有产生正确的结果:

ids.map(R.compose(R.flip(R.find)(objects), R.propEq('id')))

那也不是骰子...任何 FP 向导愿意帮助那些总是试图找出无点编程的细微差别的人吗?

更新

感谢您的回答!同意,不应该迷恋无点编程;我主要是想加深对 FP 和 Ramda 工具的理解。我同意所有发帖者的观点,即无点编程不能优先于可读性。

通过这个我肯定学到了更多关于 Ramda 的知识,并希望其他人也能这样做。 :-)

最佳答案

编辑

请注意,此处的某些文本基于使用此版本的另一个答案:innerJoin(useWith(equals, [prop('id'), identity]))。该答案已得到改进,不再使用此技术。但这些评论本身仍然有意义。


我建议您不要迷恋无点编程,只在提高可读性的地方使用它。

我发现 OriDrori 的这个变体答案更容易阅读:

const extractMatches = R.innerJoin ((o, id) => o.id === id)

const objectsList = [{ id: 1, x: 'a' }, { id: 2, x: 'b' }, { id: 3, x: 'c' }, { id: 4, x: 'd' }, { id: 5, x: 'e' }]
const ids = [1, 2, 4]

console .log (
  extractMatches (objectsList, ids)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

即使有一些没有使用 Ramda 的重量级且有点不直观的 useWith 的无点版本,也很难比上面的单行代码更具可读性。

useWith 是在许多 Ramda 用户还在使用 ES5(甚至 ES3!)时编写的。如今,这对我来说似乎很少是一个好的选择。它唯一增加的是无积分写的能力,而且通常它会掩盖一些东西。 (免责声明:我是 Ramda 的创始人之一,也是 Ramda 的忠实粉丝,但并非每个功能都得到平等的爱!)

关于functional-programming - 无积分编程拼图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58737422/

相关文章:

scala - 什么是 intercalate 的逆函数,如何实现它?

functional-programming - 二郎 : Returning from a function

functional-programming - 如何将多个参数传入 Ramda 组合链?

javascript - typescript :如何键入 Ramda R.prop(key) T' 不可分配给 '(s: {}) => {} 类型的参数

javascript - 如何使用 Ramda 编写 point-free 函数式 JS

javascript - 如果使用 Ramda reduce 但使用 native 则 Jest 测试失败

Haskell:输入 `import' 时出现解析错误

clojure - Clojure 中的 def 和 defonce 有什么区别?

functional-programming - 惰性求值在这个例子中是如何工作的?

javascript - 使用 ramda 谓词相互过滤两个列表