我有一个用匿名函数编写的函数,它会使用对象列表来组合 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/