【问题标题】:ramda js updating deeply nested arrays in second and third levelramda js 在第二和第三级更新深度嵌套的数组
【发布时间】:2018-07-29 04:51:01
【问题描述】:
const items ={
  "costList":[
     {
       "cost": [10, 20],
       "order":20
     } ,
    {
      "cost": [20, 30],
      "order":20
    }
  ],
  "testObject3":[{
    "testArray":[
      {
        testInnerArray:[10,20,30,40],
        testNumber:30
      },
     {
        testInnerArray:[10,20,30,40],
        testNumber:30
      }
    ]
  }
  ]
}

我正在尝试使用 ramda 并更新 json 文档中向下 2 级或 3 级的数组。

一个。对于第一个,我试图更新成本数组并乘以一个因子。 我使用了以下 ramda 函数,它给了我 Nan 作为值,而我期望在第一个数组索引的情况下为 [20,40] 和在第二个数组索引的情况下为 [40, 60] 。 我使用以下 ramda 语句进行转换:

const costListLens = R.lensProp('costList');

const costLens = R.lensProp('cost');

var convertedData = R.over(costListLens, R.map(R.over(costLens, R.multiply(2))
                                                          ))(items);

b.在第二种情况下,我正在尝试更新向下 3 级的数组。


const firstLevelLens = R.lensProp('testObject3');
const secondLevelLens = R.lensProp('testArray');
const thirdLevelLens = R.lensProp('testInnerArray');
R.over(firstLevelLens, R.map(R.over(secondLevelLens, R.map(R.over(thirdLevelLens, R.multiply(2))                                                         ))))(items)*

在这两种情况下,数组都设置为 Nan。你能建议错误是什么吗?

【问题讨论】:

    标签: ramda.js lenses


    【解决方案1】:

    您缺少一些 map 语句。您的镜头具有属性;但是那些不是对象而是数组。您(大概)想要使用数组的元素。所以你需要穿插map语句:

    const {lensProp, over, map, multiply} = R
    
    const items ={"costList": [{"cost": [10, 20], "order": 20}, {"cost": [20, 30], "order": 20}], "testObject3": [{"testArray": [{"testInnerArray": [10, 20, 30, 40], "testNumber": 30}, {"testInnerArray": [10, 20, 30, 40], "testNumber": 30}]}]}
    
    const costListLens = lensProp('costList')
    const costLens = lensProp('cost')
    
    const updateCosts = over(costListLens, map(over(costLens, map(multiply(2)))))
    
    console.log(updateCosts(items))
    
    const firstLevelLens = lensProp('testObject3')
    const secondLevelLens = lensProp('testArray')
    const thirdLevelLens = lensProp('testInnerArray')
    
    const updateInner = over(
      firstLevelLens, 
      map(over(secondLevelLens, map(over(thirdLevelLens, map(multiply(2))))))
    )
    
    console.log(updateInner(items)) 
    <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

    请注意,尽管如果您有这样的结构,但没有阵列,则镜头组成:

    const {lensProp, over, compose, map, multiply} = R
    
    const costListLens = lensProp('costList')
    const costLens = lensProp('cost')
    
    const simplerItems = {
      costList: {
        cost: [10, 20],
        order: 20
      }
    }
    
    const updateSimplerCosts = over(
      compose(costListLens, costLens), 
      map(multiply(2))
    )
    
    console.log(updateSimplerCosts(simplerItems))
    <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

    您同样可以compose 多个镜头。请注意,合成的顺序似乎倒退了。这就是它的工作原理,尽管有很多参考资料可以解释为什么如果您搜索 lens+compose+backward

    【讨论】:

    • 你太棒了!!非常感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2011-12-02
    • 2012-09-08
    相关资源
    最近更新 更多