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
相关产品推荐
相关产品推荐

