我正在使用 Ramda 构建一个简单的应用程序。
我遇到了一个函数组合问题,我不确定如何在不创建看似不必要的荒谬函数的情况下解决该问题。
场景:
我有一个对象作为参数传递。该对象有两个属性,以及一些与问题无关的其他属性,除了我不想更改它的状态之外:
{locCode :<string>, LocationList : [<Location>], someOtherParams : ... }
我有一个 arg 函数,可以将 locCode 转换为位置:
fetchLocByCode
我想要的结果是获取locCode
值,将其传递给fetchLocByCode
,将结果附加到LocationList
,然后返回一个使用新的 LocationList
创建新对象,而无需触及该对象上的任何其他内容。
类似于:
(Param)=>{
Param.LocationList.push(fetchLocByCode(Param.locCode));
return Param;
}
我最终为此而写的内容似乎非常荒谬,让我相信我做了一些可怕的错误:
const locListLens = R.lens(R.prop('LocationList'),R.assoc('LocationList'))
const appendLocList = (i)=>R.compose(R.over(locListLens),R.append,fetchLocByCode,R.prop('locCode'))(i)(i)
这个解决方案“有效”,但似乎我错过了一些基本想法。
有人愿意提出一种更“规范”的方式来解决这种情况吗?
最佳答案
让我们从您的初始版本开始:
Param => {
Param.LocationList.push(fetchLocByCode(Param.locCode));
return Param;
}
我非常希望不需要突变。让我们删除它:
Param =>
R.assoc('LocationList',
R.append(fetchLocByCode(Param.locCode), Param.LocationList),
Param)
我们可以使用镜头来避免两次访问 LocationList
属性:
Param =>
R.over(R.lensProp('LocationList'),
R.append(fetchLocByCode(Param.locCode)),
Param)
我们可以完全摆脱Param
吗?让我们从使用 R.converge
开始:
R.converge(R.over(R.lensProp('LocationList')),
[Param => R.append(fetchLocByCode(Param.locCode)),
R.identity])
让我们使用R.compose
从第一个分支函数中删除 Param
:
R.converge(R.over(R.lensProp('LocationList')),
[R.compose(R.append, fetchLocByCode, R.prop('locCode')),
R.identity])
每当您发现自己编写 R.converge(f, [g, R.identity])
时,您都会发现 S
的用途。组合器!
S.S(R.flip(R.over(R.lensProp('LocationList'))),
R.compose(R.append, fetchLocByCode, R.prop('locCode')))
虽然这很简洁,但我认为 R.assoc
版本还不错。 future 的读者不会喜欢理解 S.S(R.flip(R.over(R.lensProp
. ;)
关于javascript - 在 Ramda 中调用 Arg 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39538804/