如何为API返回的动态嵌套对象添加value/scale计算结果属性
问题解答
- 是否需要映射为新对象:
如果你的业务场景不需要保留原始API返回的纯净数据,可以直接在原对象上修改;如果需要避免修改原始返回值产生副作用,建议先深拷贝原对象再做处理即可,不需要全量手动映射结构。
- 是否需要映射为新对象:
- 动态结构下的实现方案:
可以用递归遍历的方式处理,不需要预设结构规则,只要判断当前遍历的对象同时存在value和scale属性,就计算result写入即可,过程中可以用Object.values遍历所有对象值,不受动态键名影响。
- 动态结构下的实现方案:
- 自动处理的实现方式:
把API调用和后续的处理逻辑封装成统一的请求方法,每次调用该方法获取API返回值后,自动执行递归处理逻辑再返回结果即可。
- 自动处理的实现方式:
实现代码
1. 递归处理函数
// 递归处理对象,添加result属性 function addResultProp(obj) { // 非对象类型直接返回 if (typeof obj !== 'object' || obj === null) return obj // 检查当前对象是否同时有scale和value属性 if (obj.hasOwnProperty('scale') && obj.hasOwnProperty('value')) { // 避免除零错误 obj.result = obj.scale === 0 ? 0 : obj.value / obj.scale } // 遍历所有属性递归处理 Object.values(obj).forEach(val => addResultProp(val)) return obj }
2. 封装API调用自动处理
// 封装统一的API调用方法 async function callApiWithResult(...args) { const rawData = await callApi(...args) // 如果需要保留原数据,先深拷贝再处理:const processedData = addResultProp(JSON.parse(JSON.stringify(rawData))) const processedData = addResultProp(rawData) return processedData } // 使用示例 const targetObj = await callApiWithResult(/* 原API调用参数 */)
如果你需要保留原始API返回数据不被修改,只需要把注释里的深拷贝逻辑放开即可,深拷贝可以根据你的场景选择JSON.parse(JSON.stringify())或者第三方工具库的深拷贝方法。
内容的提问来源于stack exchange,提问作者Gregor Wedlich
相关产品推荐
相关产品推荐

