Несколько реквизита в объективе Ramda - PullRequest
1 голос
/ 03 ноября 2019

Есть ли способ применить преобразования к нескольким ключам объекта в Ramda? Я знаю, что это возможно с помощью R.evolve, но мне интересно знать, может ли это быть достигнуто путем некоторой модификации линз. Например:

const data = {
  a: "100",
  b: "non_numeric_string",
  c: "0.5"
}

const numerize = x => +x

const mapping = {
  a: numerize,
  c: numerize
}

magicFunction(mapping, data) 

output:
{
  a: 100,
  b: "non_numeric_string",
  c: 0.5
}

1 Ответ

1 голос
/ 03 ноября 2019

Весь смысл линзы в том, чтобы сосредоточиться на одной части структуры данных. Хотя не трудно написать что-то, используя lensProp, чтобы достичь этого, я не думаю, что это либо очень удовлетворительно, либо особенно уместно использование линз. Вот одно из решений Ramda:

const magicFunction = (mapping, data) =>
  reduce 
    ( (o, [k, fn]) => over (lensProp(k), fn, o) 
    , data
    , toPairs (mapping)
    )

const numerize = x => Number (x)

const mapping = {
  a: numerize,
  c: numerize
}

const data = {a: "100", b: "non_numeric_string", c: "0.5"}

console .log (
  magicFunction (mapping, data)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script> const { lensProp, over, reduce, toPairs } = R               </script> 

Но учтите, что простая функция ES6 делает работу так же просто, без использования линз:

const magicFunction = (mapping, data) =>
  Object.entries (mapping). reduce 
    ( (o, [k, fn]) => ({...o, [k]: fn (o [k]) }) 
    , data
    )

Объективы просто не работаютполучить много здесь.

...