如何批量计算课程ratings数组平均评分并随接口响应返回前端
问题根因
Object.assign()方案仅在单课程查询场景生效,本质是该逻辑只针对单个课程对象做属性赋值,拉取全量课程列表时没有遍历data.items下的所有课程条目,同时未兼容ratings为空数组的边界情况,导致批量计算逻辑未执行。
可复用实现代码
以下逻辑同时兼容单课程查询、全量课程列表查询两种场景,不需要分开写两套处理规则:
/** * 计算课程平均评分 * @param {Object} rawRes 后端返回的原始接口响应 * @returns 注入平均评分后的完整响应数据 */ const calcCourseAverageRating = (rawRes) => { // 深拷贝原始数据,避免直接修改源对象引发其他逻辑异常 const result = structuredClone ? structuredClone(rawRes) : JSON.parse(JSON.stringify(rawRes)) // 自动适配两种返回结构:列表接口读data.items数组,单课程接口把单个对象转为数组统一处理 const courseList = Array.isArray(result.data?.items) ? result.data.items : [result.data] courseList.forEach(course => { const ratingList = course.ratings ?? [] // 无任何评分时默认置0,避免出现NaN if (ratingList.length === 0) { course.averageRating = '0' return } // 累加评分值计算平均分,保留1位小数,输出字符串和原有接口字段类型保持一致 const totalScore = ratingList.reduce((acc, cur) => acc + Number(cur.rating || 0), 0) course.averageRating = (totalScore / ratingList.length).toFixed(1) }) return result } // 调用示例:把后端返回的原始响应传入即可拿到最终给前端的结果 const finalResponse = calcCourseAverageRating(后端原始返回数据)
关键注意点
- 计算前必须把
rating字段转为数字类型,避免字段为字符串时出现拼接类计算错误 - 所有空值场景统一兜底:
ratings不存在、为空数组、单条评分值缺失时都不会抛出异常 - 处理前做数据拷贝,不修改原始接口返回的引用数据,不会影响其他依赖原始数据的业务逻辑
- 计算后的
averageRating保留字符串类型,和原有接口的字段类型一致,不会触发前端类型匹配问题
内容的提问来源于stack exchange,提问作者gaiyaobed
相关产品推荐
相关产品推荐

