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

JS实现成绩等级转数值并补全必填课程成绩的函数问题

问题排查&实现方案

现有代码问题点

  • 等级转换逻辑错误:遍历entries获取的el是[课程名, 等级]结构,你错误的对newKeys.key(不存在的属性)做判断,且判断对象是课程名而非等级值,导致所有转换结果都为0
  • 动态键赋值语法错误:给缺失的必修课程赋值时写了newScores.requiredClasses[index],这是操作newScores下的requiredClasses属性,而非把requiredClasses[index]作为新键,正确语法是newScores[requiredClasses[index]] = 0
  • 冗余代码过多:重复声明scoresKey/scoresValue/newKeys等功能重复的变量,完全可以用entries直接处理
  • 数组遍历方式不规范:用for...in遍历数组,存在遍历到原型链上自定义属性的风险,数组遍历推荐用forEach/普通for循环

正确实现代码

const getExamResult = (scores, requiredClasses) => {
  // 先定义等级映射表,比一堆if-else更清晰易维护
  const gradeMap = {
    'A+': 4.5,
    'A': 4,
    'B+': 3.5,
    'B': 3,
    'C+': 2.5,
    'C': 2,
    'D+': 1.5,
    'D': 1,
    'F': 0
  }
  const result = {}
  // 处理现有scores的转换
  Object.entries(scores).forEach(([className, grade]) => {
    result[className] = gradeMap[grade]
  })
  // 处理必修课程中缺失的科目
  requiredClasses.forEach(className => {
    if (!(className in result)) {
      result[className] = 0
    }
  })
  return result
}

更优实现方案

用Object.fromEntries简化代码,减少手动遍历的冗余:

const getExamResult = (scores, requiredClasses) => {
  const gradeMap = {'A+':4.5,'A':4,'B+':3.5,'B':3,'C+':2.5,'C':2,'D+':1.5,'D':1,'F':0}
  // 先转换现有成绩
  const result = Object.fromEntries(
    Object.entries(scores).map(([k, v]) => [k, gradeMap[v]])
  )
  // 补全缺失的必修科目,空值赋值运算符仅在键不存在时赋值,不会覆盖已有成绩
  requiredClasses.forEach(k => result[k] ??= 0)
  return result
}

内容的提问来源于stack exchange,提问作者jjeon17 jjeon17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:06:04