繁体   English   中英

在 object 上执行 function 然后在 Ramda 中操作 object

[英]Performing function on object and then manipulating the object in Ramda

我正在为一点点 ramda 逻辑而苦苦挣扎,我觉得我几乎已经掌握了,但我的大脑今天无法正常工作。

我有一个 object:

const thing = {
  'name': 'thing',
  'value': 1000.0987654321,
  'valueAsString': "1000.0987654321",
  'otherThings': { 'blah': 'blah' },
}

我想从事物中提取“名称”和“值”,但我想在返回我的新 object 之前对值进行四舍五入。

我知道要提取名称和值,我可以使用 pick: R.pick(['name', 'value'])并执行我的舍入 function,我可以采用现有的舍入 ZC1C425268E68384F14B5A

const roundTo9Dp = (n) => Number((n).toFixed(9))

并将其应用于我的R.compose(roundTo9Dp, R.prop('value'))如下所示:

这两个操作独立工作:

const picker = R.pick(['name', 'value'])
picker(thing) // => {"name": "thing", "value": 1000.0987654321}

const rounded = R.compose(roundTo9Dp, R.prop('value'))
rounded(thing) // => 1000.098765432

当我把他们结合在一起时,我正在挣扎。 就好像他们在不同层次上操作“东西”,而我只是在努力解开它们。

R.compose(picker, R.assoc('value', rounded))(thing) // Incorrect
picker(R.compose(R.assoc('value'), rounded)(thing)(thing)) // works, but is hideous

使用 Ramda 有很多方法可以做到这一点。 这里有几个:

 const roundTo9Dp = (n) => Number((n).toFixed(9)) const foo1 = applySpec({ name: prop('name'), value: compose(roundTo9Dp, prop('value')) }) const foo2 = pipe( pick (['name', 'value']), over (lensProp ('value'), roundTo9Dp) ) const rounded = R.compose(roundTo9Dp, R.prop('value')) const foo3 = pipe( pick (['name', 'value']), chain(assoc('value'), rounded) ) const foo4 = pipe( props (['name', 'value']), zipWith (call, [identity, roundTo9Dp]), zipObj (['name', 'value']) ) const thing = {name: 'thing', value: 1000.0987654321, valueAsString: "1000.0987654321", otherThings: {blah: 'blah'}} console.log ('foo1:', foo1 (thing)) console.log ('foo2:', foo2 (thing)) console.log ('foo3:', foo3 (thing)) console.log ('foo4:', foo4 (thing))
 <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script> <script> const {applySpec, prop, compose, pipe, pick, over, lensProp, chain, assoc, props, zipWith, call, identity, zipObj} = R </script>

如果我们尝试,我们可以想出更多。 foo3可能最接近您正在努力解决的问题。 当应用于函数时, chain的工作方式类似于chain (f, g) (x) //=> f (g (x)) (x) ,这样可以避免您的版本中出现丑陋的(thing) (thing) 这个版本可能会教你一些关于FantasyLand类型类的世界。 foo1使用 Ramda 更方便的 object 操作函数之一, applySpec foo2使用lensPropover ,可以带你进入迷人的镜头世界。 并且foo4 ,虽然可能不推荐,但展示了zipWithzipObj ,用于组合列表的函数。

但除非这是关于学习Ramda,否则我不建议使用这些,因为这很简单,无需现代 JS 中的任何库即可:

const foo = ({name, value}) => 
  ({name, value: roundTo9Dp(value)})

我是 Ramda 的创始人之一,我仍然是一个忠实的粉丝。 但是我认为它是一个库,当它使代码更清晰和更易于维护时可以使用它。 在这里,最简单的版本不需要它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM