是否可以将转换应用于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
)
镜头在这里根本无法给您带来很多好处。