如何使用Ramda将给定API响应数据标准化为目标对象结构
实现代码
你可以直接用Ramda的函数式组合实现需求,这里提供两种写法:
写法1:更简洁的indexBy实现(推荐)
indexBy 比 reduceBy 更适配「数组按唯一字段转键值对对象」的场景,代码可读性更高:
import * as R from 'ramda' const standardizeApiConfig = R.pipe( // 分别处理任务配置和预约配置 R.applySpec({ // 处理任务组配置:转成别名作为key的对象,同时过滤多余字段 taskGroups: R.pipe( R.prop('tasksConfigs'), R.map(R.pick([ 'taskTypeGroupAlias', 'taskTypes', 'isReadonly', 'isEnable', 'shouldRepeatUntilTaskDone', 'remindersNumber', 'reminderRepeatIntervalMinutes', 'reminderInAdvanceMinutes' ])), R.indexBy(R.prop('taskTypeGroupAlias')) ), // 处理预约配置:映射为Visits字段 visitConfig: R.pipe( R.prop('appointmentsConfig'), R.pick(['isReadonly', 'isEnable', 'reminderInAdvanceMinutes']), R.objOf('Visits') ) }), // 合并两部分配置得到最终结果 R.chain(R.merge, R.prop('taskGroups')), R.prop('visitConfig') ) // 调用方式 const standardizedResult = standardizeApiConfig(你的原始API返回对象)
写法2:按你猜测的reduceBy实现
如果你需要用reduceBy完成,写法如下:
import * as R from 'ramda' const standardizeApiConfig = (rawData) => R.pipe( R.prop('tasksConfigs'), // 按taskTypeGroupAlias分组,每个分组直接取原配置项 R.reduceBy( (_, item) => R.pick([ 'taskTypeGroupAlias', 'taskTypes', 'isReadonly', 'isEnable', 'shouldRepeatUntilTaskDone', 'remindersNumber', 'reminderRepeatIntervalMinutes', 'reminderInAdvanceMinutes' ])(item), {}, R.prop('taskTypeGroupAlias') ), // 合并Visits配置 R.mergeLeft(R.pipe( R.prop('appointmentsConfig'), R.pick(['isReadonly', 'isEnable', 'reminderInAdvanceMinutes']), R.objOf('Visits') )(rawData)) )(rawData)
内容的提问来源于stack exchange,提问作者shabspb
相关产品推荐
相关产品推荐

