javascript - 在 Ramda 中调用 Arg 两次

标签 javascript ramda.js

我正在使用 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/

相关文章:

javascript - 验证单选按钮组

javascript - 类似 Facebook 的 anchor 滚动

javascript - 如何创建一个动态的固定div

php - 将 JSON 发布到 PHP 脚本

javascript - 使用 Ramda 映射和过滤对象

javascript - 在php中提交后如何保留动态选择的值

javascript - 了解 Ramda 中的 compose?

javascript - Ramda 中的嵌套占位符

javascript - 使用 ramda 按变量升序/降序

javascript - 通过使用 Ramda 将 Value 中的字段附加到 Key 中来修改对象的 Key