You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量计算课程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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:01:41