JavaScript成绩等级判断函数返回undefined问题排查及优化方案咨询
问题解答
嘿,我来帮你搞定这两个问题~
1. 解决getGrade返回undefined的问题
你的问题出在values的定义上:
var values = [Object.values(gradeDict)]
Object.values(gradeDict)本身已经返回了一个包含所有等级数组的数组(比如[[26,27,...30], [21,...25], ...]),但你又额外给它套了一层数组,变成了[[[26,...], [21,...]]]。这样my_index函数遍历的时候,会检查外层数组的唯一元素(那个大数组)是否包含score——显然不可能,所以my_index返回undefined,最终keys[undefined]自然就是undefined了。
只需要把这行代码改成直接赋值:
var values = Object.values(gradeDict);
修正后的完整getGrade函数:
function getGrade(score) { let grade; var gradeDict = { 'A': [26, 27, 28, 29, 30], 'B': [21, 22, 23, 24, 25], 'C': [16, 17, 18, 19, 20], 'D': [11, 12, 13, 14, 15], 'E': [6, 7, 8, 9, 10], 'F': [0, 1, 2, 3, 4, 5] } var keys = Object.keys(gradeDict); var values = Object.values(gradeDict); // 这里修改了 grade = keys[my_index(values, score)] return grade; }
这样my_index就能正确遍历每个等级的分数数组,返回对应的索引,最终拿到正确的等级。
2. 更优的实现方式
你当前的方式需要枚举每个整数分数,不仅冗余,还不支持小数分数。这里提供两种更灵活简洁的方案:
方案一:基于区间判断(直观且支持小数)
直接定义每个等级对应的分数区间,遍历找到匹配的区间即可:
function getGrade(score) { // 按从高到低的顺序定义区间,完全符合规则:25 < score <=30 → A,以此类推 const gradeRules = [ { grade: 'A', min: 25, max: 30 }, { grade: 'B', min: 20, max: 25 }, { grade: 'C', min: 16, max: 20 }, { grade: 'D', min: 11, max: 16 }, { grade: 'E', min: 6, max: 11 }, { grade: 'F', min: 0, max: 6 } ]; // 找到第一个符合条件的区间 const matchedRule = gradeRules.find(rule => score > rule.min && score <= rule.max); // 处理边界情况(比如score超过30或小于0,默认返回F) return matchedRule ? matchedRule.grade : 'F'; }
这个方案逻辑清晰,不管分数是整数还是小数都能正确判断,后续修改区间也非常方便。
方案二:数学计算(极简,适合整数分数场景)
如果分数都是整数,可以通过数学计算直接映射到等级,代码超短:
function getGrade(score) { const grades = ['F', 'E', 'D', 'C', 'B', 'A']; // 计算对应的索引:每5分一个区间,通过floor运算映射 const index = Math.min(Math.floor((score - 1) / 5), 5); // 处理负数分数,默认返回F return grades[index >= 0 ? index : 0]; }
举几个例子:
- score=30 →
(30-1)/5=5.8→ floor后是5 → grades[5] = 'A' - score=25 →
(25-1)/5=4.8→ floor后是4 → grades[4] = 'B' - score=5 →
(5-1)/5=0.8→ floor后是0 → grades[0] = 'F'
这个方案代码极简,适合分数为整数的场景。
内容的提问来源于stack exchange,提问作者Imtiaz Ahmed
相关产品推荐
相关产品推荐

