如何用Ramda.js的ifElse更新JSON数组属性:提取C1或设为null
需求与问题
需求描述
在对象数组中处理message字段:
- 若字段包含子串“C1”,更新为以“C1”开头的子串
- 若字段不包含“C1”,则将
message设为null
输入示例
[{ message: 'A1 Message, B1 Message, C1 Message' }, { message: 'A1 Message, B1 Message' }];
输出示例
[{ message: 'C1 Message' }, { message: null }];
已尝试代码
var input = [{ id: 1, message: 'A1 Message, B1 Message, C1 Message' }, { id: 2, message: 'A1 Message, B1 Message' }]; var updateMessage = (obj) => { var C1Message = R.pipe( R.prop('message'), R.splitAt(obj.message.indexOf('C1')), R.last )(obj); return R.assoc('message', C1Message, obj); } var updateArray = R.map(R.when(R.pipe(R.prop('message'), R.includes('C1')), updateMessage)); var output = updateArray(input); console.log(output);
用户问题
如何使用Ramda.js的ifElse函数,使不含“C1”的对象的message字段设为null?
解决方案
用R.ifElse替代原有的R.when,即可同时处理“包含C1”和“不包含C1”两种分支逻辑:
修改后完整代码
var input = [{ id: 1, message: 'A1 Message, B1 Message, C1 Message' }, { id: 2, message: 'A1 Message, B1 Message' }]; var updateMessage = (obj) => { const C1Message = R.pipe( R.prop('message'), R.splitAt(R.prop('message', obj).indexOf('C1')), R.last )(obj); return R.assoc('message', C1Message, obj); }; // 用ifElse替代when,覆盖两种处理分支 var updateArray = R.map( R.ifElse( R.pipe(R.prop('message'), R.includes('C1')), updateMessage, R.assoc('message', null) // 不包含C1时设置message为null ) ); var output = updateArray(input); console.log(output);
代码说明
R.ifElse接收三个参数:判断条件函数、满足条件的处理函数、不满足条件的处理函数- 不满足条件时,直接用
R.assoc('message', null)生成新对象(Ramda为纯函数,不会修改原对象) - 若想更贴合Ramda的函数式风格,可以把
updateMessage优化为纯函数组合:
var updateMessage = R.pipe( R.prop('message'), R.splitAt(R.indexOf('C1')), R.last, R.assoc('message', R.__) );
这样完全通过Ramda函数组合实现,避免直接操作对象属性。
内容的提问来源于stack exchange,提问作者Nadhas
相关产品推荐
相关产品推荐

