我无法绕过这条管道。给定一组学生,我想映射它们,根据现有属性(icon
)的值添加新属性(grade
)。我暂时忽略了映射部分并专注于每个问题,从而将问题分解为更小的部分。
条件
为此,我决定使用R.cond
Getter and Setter
我正在使用镜头
完整代码
const student = {
"studentName" : "Nancy",
"grade": "junior",
}
const gradeLens = R.lensProp('grade')
const iconLens = R.lensProp('icon')
const findCondition = R.cond([
[ R.equals('sophomore'), R.always('bath') ],
[ R.equals('junior'), R.always('envelope-open') ],
[ R.equals('senior'), R.always('microchip') ]
])
//Compose the functions together
const setStudentIcon = R.compose(R.set(iconLens), findCondition, R.view(gradeLens))
R.set
需要3个参数,这意味着必须像这样调用此函数:
setStudentIcon(student)(student)
我对功能编程还不太了解,但这似乎不是构成镜头的正确方法。
答案 0 :(得分:0)
你可以这样写:
const setStudentIcon = R.chain(
R.compose(R.set(iconLens), findCondition),
R.view(gradeLens)
);
setStudentIcon(student);
//=> {grade: 'junior', icon: 'envelope-open', studentName: 'Nancy'}
这利用了chain
对函数的处理方式,即chain(f, g)(x) //=> f(g(x), x)
。
您可以在 Ramda REPL 上看到这一点。