javascript - 使用 Ramda 镜头更改多个对象

标签 javascript json functional-programming ramda.js

我目前的数据结构大致如下所示:

var data = { "id": 123,
    "modules": [{
        "id": 1,
        "results": [{
            "status": "fail",
            "issues": [
                {"type": "change", "status": "warn", "data": {}},
                {"type": "remove", "status": "warn", "data": {}},
                {"type": "change", "status": "warn", "data": {}}
            ]
        }]
    },{
        "id": 2
        "results": [{
            "status": "pass",
            "issues": [
                {"type": "change", "status": "warn", "data": {}},
                {"type": "remove", "status": "warn", "data": {}},
                {"type": "change", "status": "warn", "data": {}}
            ]
        }]
    }]
}

我一直在尝试使用 Ramda 来编写一个组合查询,它可以做一些事情,比如更改特定类型的所有问题的状态。

我一直在尝试按照通过 R.map/R.chain 组合镜头的方式做一些事情,但我似乎无法解决。我正在尝试做这样的事情:

let approvedData = R.compose(
  R.set(R.__, 'approve', Data)
  R.lensProp('status')
  R.map(R.lensIndex),
  R.lensProp('issues'),
  R.map(R.lensIndex),
  R.lensProp('results'),
  R.map(R.lensIndex),
  R.lensProp('modules')
)(Data)

并让它返回状态已更改的完整数据集。

更新:

我已经想出了一些代码来完成我想做的事情,但我仍在努力将每个步骤变成可以组合的函数:

R.over(R.lensProp('modules'), R.map(
  R.over(R.lensProp('results'), R.map(
    R.over(R.lensProp('issues'), R.map(
      R.set(R.lensProp('status'), 'approve')
    ))
  ))
), Data)

最佳答案

你更新的解决方案对我来说看起来不错,但可以通过组合创建转换函数:

//  update$modules$results$issues$status :: (String -> String) -> Object -> Object
var update$modules$results$issues$status = R.compose(
  R.over(R.lensProp('modules')),
  R.map,
  R.over(R.lensProp('results')),
  R.map,
  R.over(R.lensProp('issues')),
  R.map,
  R.over(R.lensProp('status'))
);

update$modules$results$issues$status(R.always('approve'))(data);

关于javascript - 使用 Ramda 镜头更改多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39684324/

相关文章:

javascript - SlideToggle 删除其他事件类

angularjs - 我们可以将 $http 注入(inject) Angular 服务并将该数据传递给 Controller ​​吗?

haskell - Haskell 的 Erlang 等价物 where/partial/lambda

Java Swing应用程序->servlet的JSON信息,怎么做? http? socket ?

java - Java 8 中的偏函数应用

web-services - 用于检查用哪种编程语言编写代码的网站?

javascript - contenteditable div 在光标位置设置 PX 字体大小

javascript - 如何使用 Protractor 测试 asp.net webforms(非 Angular )?

javascript - document.getElementById(id) 和切换多个 id

java - 解析包含 Long 值的 JSON 字符串时出现 NumberFormatException