Ramda从数组内部的嵌套对象中获取值

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

我正在尝试使用Ramda从嵌套对象中获取值,但我刚刚开始使用它。要获得我使用的testArray:

R.find(R.propEq('type', 'checklist'))((data))

数据是具有不同类型的另一个数组,但是我只需要关注'清单'类型。我只想获取属性为“ checked”的项目:true。

这是我要转换的数组。

const testArray = [{
  "type": "checklist",
  "data": {
    "items": [
      { "id": "r-1", "checked": true },
      { "id": "r-2", "checked": false }
    ]
  }
}]

编辑:我使用了另一个步骤:

R.path(['data', 'items'])

我只有可以简单过滤的项目。但是我不确定这是否是正确的方法。

任何帮助将不胜感激。

ramda.js
1个回答
2
投票

这里是一种方法:

const checkedItems = pipe (
  find (propEq('type', 'checklist')),
  defaultTo ({data: {items: []}}),
  path (['data', 'items']),
  filter (prop ('checked'))
)

const testArray = [{type: "checklist", data: {items: [{id: "r-1", checked: true }, {id: "r-2", checked: false}]}}]

console .log (
  checkedItems (testArray)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script>const {pipe, find, propEq, defaultTo, path, filter, prop} = R</script>

Ramda(免责声明:我是它的作者之一)是围绕功能性管道这一思想而设计的,其中一个调用的结果被传递到下一个调用中。在这里,我们使用开始时使用的propEq,将其通过管道传递给defaultTo调用,如果上一步没有发现任何错误,则将其作为明智的默认值,然后传递给您使用的path语句,最后传递给filter呼叫,仅保留checked属性为true的呼叫。

如果您完全确定自己的数据,则可以跳过defaultTo步骤。

filter调用也可以是filter (propEq ('checked', true)),但是由于prop ('checked')应该返回布尔值,因此我选择了更简单的版本。

© www.soinside.com 2019 - 2024. All rights reserved.