Весь смысл линзы в том, чтобы сосредоточиться на одной части структуры данных. Хотя не трудно написать что-то, используя 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
)
Объективы просто не работаютполучить много здесь.