Ramda Получить значения из вложенных объектов в массиве - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь получить значения из вложенного объекта с помощью Ramda, но я только начал его использовать. Чтобы получить testArray, я использовал:

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

Данные - это другой массив с другими типами, но мне нужно сосредоточиться только на типе «контрольного списка». Я хотел бы получить только те элементы, которые имеют свойство «флажок»: true.

Это мой массив, который я пытаюсь преобразовать.

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

Редактировать: Я сделал еще один шаг, используя:

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

Я получил только элементы, которые я могу просто отфильтровать. Но я не уверен, что это правильный способ сделать это.

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 28 апреля 2020

Вот один подход:

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>

Рамда (отказ от ответственности: я один из ее авторов) разработан вокруг этой идеи функционального конвейера, где результат одного вызова передается в следующий. Здесь мы используем propEq, с которого вы начали, направляем его на вызов defaultTo, который дает разумное значение по умолчанию, если предыдущий шаг ничего не находит, затем к используемому оператору path, а затем, наконец, к filter вызов, который сохраняет только те, где свойство checked равно true.

Если вы абсолютно уверены в своих данных, вы можете пропустить шаг defaultTo.

The * Вызов 1020 * также может быть filter (propEq ('checked', true)), но поскольку prop ('checked') возвращает логическое значение, я выбрал более простую версию.

...