2017-10-09 95 views
1

Ramda是我的第一个函数式编程库,现在我比较Sanctuary和Ramda。也许我的一些问题太愚蠢了,但我没有找到学习圣所的最佳方式。我可以通过对象propery“通过”保护区

我的问题是: 我怎么能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]} 

是保护区有任务过路费?

回答

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.overR.lensProp之类的值来将变换应用于numbers字段的值。 Sanctuary尚未提供任何用于处理镜头的功能。如果您有兴趣将这些功能添加到库中,请考虑对sanctuary-js/sanctuary#177发表评论。