составление линз с использованием рамды - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь запросить содержимое вложенного объекта coor.

const data = [ 
   [ [{geo: {coor: [1,2]}}, {geo: {coor: [4,5]}}], {} ], 
   [ [{geo: {coor: [8,2]}}, {geo: {coor: [9,5]}}], {} ]
 ]

Результат должен быть следующим:

[[[1, 2], [4, 5]], [[8, 2], [9, 5]]]

Я использую следующий код для получения этого результата:

const viewLens = R.view(R.lensPath(['geo', 'coor']))
R.map(R.map(viewLens), R.map(R.view(lensIndex(0)), data))

, но я хотел бы составить объективэто может быть использовано для отображения на data, что-то вроде:

const coorLens = R.compose(R.lensIndex(0), ..., R.lensPath(['geo', 'coor']))

, которое можно использовать как:

R.map(coorLens, data)

Кто-нибудь знает, как построить такой объектив?

Спасибо!

1 Ответ

0 голосов
/ 30 мая 2018

Существует понятие установщика 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>
...