Существует понятие установщика mapped
, который можно использовать для обновления значений по функторам в конструкции объектива, хотя это можно использовать только с over
/ set
, а не view
(т.е. какВы выбираете элементы из чего-то, что может быть изменено только с помощью map
?)
Существует также понятие проходимой оптики, которая может фокусироваться на многих элементах, а не на одном.Это позволяет вам одновременно обновлять все элементы, находящиеся в фокусе, и при условии, что вы можете указать, как вы хотите, чтобы многие элементы были объединены в один результат, вы также можете просмотреть их.Это не даст вам точно такой же структуры, поскольку все выделенные элементы будут объединены вместе в отличие от списка списков в вашем примере.
Сама Рамда не предлагает эту функцию, хотя ее можно найти в ramda-lens библиотека.
const RL = ramdaLens
const data = [
[ [{geo: {coor: [1,2]}}, {geo: {coor: [4,5]}}], {} ],
[ [{geo: {coor: [8,2]}}, {geo: {coor: [9,5]}}], {} ]
]
const coorLens = R.compose(
RL.traversed,
R.lensIndex(0),
RL.traversed,
R.lensPath(['geo', 'coor'])
)
console.log(
"Combine all the focused elements in a list\n",
RL.listOf(coorLens, data)
)
console.log(
"Update all the focused elements\n",
RL.over(coorLens, R.map(R.inc), data)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
<script src="https://wzrd.in/standalone/ramda-lens"></script>
Я чувствую, что стоит отметить, что если вы ничего не получите здесь благодаря способности составлять линзы или одновременно просматривать и обновлять фокусированные элементы, тогда это может бытьПроще избегать использования объективов с возможно более простой композицией функций, как показано ниже.
const data = [
[ [{geo: {coor: [1,2]}}, {geo: {coor: [4,5]}}], {} ],
[ [{geo: {coor: [8,2]}}, {geo: {coor: [9,5]}}], {} ]
]
const fn = R.map(R.pipe(R.head, R.map(R.path(['geo', 'coor']))))
console.log(
"Without lenses\n",
fn(data)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>