Ramda镜头中的多个道具

Multiple props in Ramda lens

有没有办法在 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
}

镜头的重点是关注数据结构的一部分。虽然使用 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
    )

在这里,镜片对您的帮助不大。