Ramda管道中满足isValueValid条件时传递值的实现问题
Ramda Pipe中ifElse逻辑错误,如何在isValueValid返回true时保留当前值?
我写了这段Ramda管道函数代码,用来从pSet属性里提取对应的值,但最后一个R.ifElse环节没法正常工作。我的需求是当isValueValid返回true时,传递当前的这个值,反之返回null。麻烦帮我看看该怎么修改?
export const getValueFromPsetProperty = (pset: string, property: string) => R.pipe( R.prop('pSets'), R.find(R.propEq('name', pset)), R.propOr([], 'properties'), R.find(R.propEq('name', property)), R.propOr(null, 'value'), R.ifElse(isValueValid, null,R.identity), );
问题分析
你这里的问题出在R.ifElse的参数使用上:
- Ramda的
ifElse签名是ifElse(predicate, whenTrue, whenFalse),也就是条件为true时执行第二个函数,false时执行第三个函数,你现在把分支顺序搞反了。 - 另外,第二个参数你传了
null,但ifElse的分支需要是函数(会接收当前值作为参数),直接传null会导致它被当作值立即返回,而不是条件满足时才返回。
解决方案
方案1:修正ifElse的参数和分支
把最后一行的ifElse调整顺序,并且把null改成返回null的函数:
export const getValueFromPsetProperty = (pset: string, property: string) => R.pipe( R.prop('pSets'), R.find(R.propEq('name', pset)), R.propOr([], 'properties'), R.find(R.propEq('name', property)), R.propOr(null, 'value'), // 条件为true时返回原值,false时返回null R.ifElse(isValueValid, R.identity, () => null), );
方案2:用R.when简化逻辑
如果你的需求是“当值无效时转为null,有效时保留”,用R.when会更简洁(when是当条件满足时执行转换,否则返回原值):
export const getValueFromPsetProperty = (pset: string, property: string) => R.pipe( R.prop('pSets'), R.find(R.propEq('name', pset)), R.propOr([], 'properties'), R.find(R.propEq('name', property)), R.propOr(null, 'value'), // 当值无效时返回null,否则保持原样 R.when(R.complement(isValueValid), () => null), );
补充说明
R.identity是Ramda内置的“返回输入值”的函数,正好满足你“传递当前值”的需求。R.complement(isValueValid)会返回一个新函数,作用是反转isValueValid的结果(即原来返回true的情况现在返回false,反之亦然),配合when就可以实现“无效值转null”的逻辑。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

