Ramda是我的第一个函数式编程库,现在我将Sanctuary与Ramda进行比较。也许我的一些问题太愚蠢,但我没有找到学习圣域的最佳方法。
我的问题如下:
我如何在Object的嵌套属性中map
数组?
Ramda代码:
const addOneForNumbers = R.over(R.lensProp('numbers'), R.map(R.add(1)))
addOneForNumbers({ numbers: [1, 2, 3, 4, 5] })
// {"numbers": [2, 3, 4, 5, 6]}
庇护所是否有通行费?
答案 0 :(得分:1)
在这种情况下,仅存在避难所解决方案,但在一般情况下需要镜头。
这个特殊问题可以用这种方式解决:
> S.map(S.map(S.add(1)), {numbers: [1, 2, 3, 4, 5]})
{numbers: [2, 3, 4, 5, 6]}
这取决于{numbers: [1, 2, 3, 4, 5]}
是StrMap (Array Number)
的成员。由于字符串映射是仿函数,我们可以映射字符串映射以访问数组,然后映射数组以访问数字。
如果对象具有不同类型的其他字段,则它不是字符串映射。 {active: true, numbers: [1, 2, 3, 4, 5]}
的类型为{ active :: Boolean, numbers :: Array Number }
,为记录类型。记录类型不支持映射,因此我们需要R.over
和R.lensProp
之类的内容将转换应用于numbers
字段的值。 Sanctuary尚未提供使用镜头的任何功能。如果您有兴趣将这些功能添加到库中,请考虑对sanctuary-js/sanctuary#177进行评论。