无点编程难题

问题描述 投票:0回答:1

我有一个用匿名函数编写的函数,该函数将使用与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向导都在乎帮助那些总是想弄清楚无点编程细微差别的人吗?

functional-programming ramda.js
1个回答
0
投票

要获得Array.map()的无点映射回调,您需要通过使用R.pipe(或R.compose颠倒顺序)来创建谓词,以将当前id传递给R.propEq。您需要翻转R.find,以便它不能首先获取对象数组。但是,您还需要使用R.nAry将函数的偶数限制为1,因为Array.map()将3个参数传递给回调(项,索引,原始数组):

const { nAry, pipe, propEq, flip, find } = R

const objectsList = [{ id: 1 }, { id: 2 }]
const ids = [2]

const fn = nAry(1, pipe(propEq('id'), flip(find)(objectsList)))

const result = ids.map(fn)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

如果要放弃Array.map()并创建无点功能,则可以使用R.innerJoin。要创建谓词,请使用R.useWith从对象中获取id,然后使用R.equals与数组中的项目进行比较:

const { innerJoin, useWith, equals, prop, identity } = R

const fn = innerJoin(useWith(equals, [prop('id'), identity]))

const objectsList = [{ id: 1 }, { id: 2 }]
const result = fn(objectsList, [2])
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
© www.soinside.com 2019 - 2024. All rights reserved.