Ramda镜头中的多个道具

问题描述 投票:1回答:1

是否可以将转换应用于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
}
ramda.js
1个回答
1
投票

镜头的重点是将注意力集中在数据结构的一部分上。尽管使用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
    )

镜头在这里根本无法给您带来很多好处。

© www.soinside.com 2019 - 2024. All rights reserved.