Вот один подход:
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')
возвращает логическое значение, я выбрал более простую версию.