Functional programming 无点编程难题

Functional programming 无点编程难题,functional-programming,ramda.js,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',

我有一个用匿名函数编写的函数,该函数将使用对象列表生成一个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工具的理解。我同意所有的海报,无点编程不能优先于可读性


通过这次活动,我确实学到了很多关于拉姆达的知识,希望其他人也能这样做。:-)

由于
Array.map()
将3个参数传递给回调函数(值、索引、原始数组),因此需要使用
R.unary
将函数的arity限制为1
R.propEq
需要3个参数,传递给maps回调的值填充它们,调用函数,
R.find
获取结果,而不是函数

constobjectslist=[{id:1},{id:2}]
常量ID=[2]
常量fn=R.1元(R.compose(R.flip(R.find)(objectsList),R.propEq('id'))
const result=ids.map(fn)
console.log(结果)
编辑:正如斯科特所指出的,我没有仔细阅读这个问题。这不是无点风格,我认为实现无点风格的解决方案不是一个好主意。斯科特对Ori Drori答案的变异在我看来很好

我将重新解释这个问题:“给定一个对象列表,只保留那些ID为白名单的对象”

鉴于这些目标:

constobjects=[{id:1,title'foo'},{id:2,title'bar'}];
这个白名单:

const白名单=[2];
然后你可以做:

const inArray=flip(包括);
过滤器(属性(inArray(白名单),'id'),对象);
//=>[{“id”:2,“title”:“bar”}]
编辑

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


我建议您不要盲目追求无点编程,只在提高可读性的地方使用它

我觉得Oridori的这个答案更容易理解:

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'}]
常量ID=[1,2,4]
控制台日志(
提取匹配项(objectsList,ID)
)

你说的“但那不好”是指“它不起作用”?@Bergi:不,“这是彻头彻尾的邪恶!”;-)请注意,这个问题是专门关于做这一点自由。正如我在回答中提到的,我认为这不是一个好主意,但你可能想在这里指出你没有这样做。@ScottSauyet正确!同意了!当然,我们可以使用
R.map
,它没有
Array.prototype.map
问题。这两种解决方案中的任何一种似乎都比它们需要的复杂,只是为了支持无点编程。这就是被问到的问题,所以它是完全合适的(投票赞成!),但这类代码让人怀疑过度依赖无点。我找到了一个更好的解决方案,它不使用
R.useWith
。您可能希望在回答中包含前面的代码,因为关于
R.useWith
的段落现在缺少上下文。谢谢,Ori Drori。更新了我的答案。新版本非常好。