Angular11中setRemark方法逻辑错误:70分仍显示通过
问题:setRemark方法逻辑异常,70分仍显示“通过”
我实现了setRemark方法,用来根据成绩返回“通过”或“不通过”——小学成绩以75分为及格线,大学成绩以3分为及格线。但现在方法逻辑有问题,哪怕成绩是70分,依然会显示“通过”。相关代码和调用逻辑如下:
private getFinalGrade(studentId: number, gradingSections: IGradingSection[], transmutation: ITransmutation) { let finalGrade: number = 0; let grades: number[] = []; let gradingSectionNumber = gradingSections.length; for (let gradingSection of gradingSections) { let weightedPercentageGrade = (new StudentGradeComputerService(studentId)) .setAssessment(gradingSection.assessments) .setTransmutation(transmutation) .generate() .getTotalWeightedScore(); grades.push(weightedPercentageGrade); finalGrade += weightedPercentageGrade; } return {grades, finalGrade: finalGrade / gradingSectionNumber}; } private setRemark(grades: number, removalGrade: number) { if(removalGrade) { grades = removalGrade; } let passingGrade = (grades < 6) ? 3 : 75; let condition = (passingGrade == 3) ? (grades <= 3) : (grades >= passingGrade); console.log(condition) return (condition && grades != 0) ? "Passed" : "Failed"; }
更新:调用setRemark的代码
private getStudentScheduleBySession(studentRecord): void { let studentReportData: object[] = []; let maxGradingSections: number = 1; studentRecord.forEach((subject) => { let newData = subject; let grades = this.getFinalGrade(subject.student_id, subject.schedule.class_record.sections, subject.schedule.class_record.transmutation); newData["finalGrade"] = grades.finalGrade; newData["grades"] = grades.grades; newData["remark"] = this.setRemark(newData["final_grade"], newData["removal_grade"]); studentReportData.push(newData); maxGradingSections = (grades.grades.length > maxGradingSections) ? grades.grades.length : maxGradingSections; }) this.maxGradingSections = maxGradingSections; this.studentReportData = studentReportData; }
问题原因分析
经排查,核心问题是字段名拼写错误:
- 代码中给
newData赋值的是finalGrade(驼峰命名),但调用setRemark时传入的是newData["final_grade"](下划线命名),这个字段根本没定义,导致setRemark的第一个参数grades为undefined。 - 当
grades是undefined时,JS会把它隐式转换为NaN,NaN < 6判定为true,因此passingGrade被设为3;接着NaN <= 3同样判定为true,同时NaN != 0也为true,最终返回“Passed”,这就是70分却显示通过的根本原因。
修复方案
- 修正字段名:把调用
setRemark时的final_grade改成finalGrade,确保传入正确的最终成绩:
newData["remark"] = this.setRemark(newData["finalGrade"], newData["removal_grade"]);
- 额外优化建议:
- 给
newData定义TypeScript接口,约束字段类型和名称,编译阶段就能发现拼写错误; - 在
setRemark方法中增加参数校验,避免非数字值导致逻辑异常:
- 给
private setRemark(grades: number | undefined, removalGrade: number | undefined) { // 确定有效成绩 let effectiveGrade: number; if (removalGrade !== undefined && !isNaN(removalGrade)) { effectiveGrade = removalGrade; } else if (grades !== undefined && !isNaN(grades)) { effectiveGrade = grades; } else { // 无效成绩默认返回Failed return "Failed"; } let passingGrade = effectiveGrade < 6 ? 3 : 75; let condition = passingGrade === 3 ? effectiveGrade <= 3 : effectiveGrade >= passingGrade; return condition && effectiveGrade !== 0 ? "Passed" : "Failed"; }
内容的提问来源于stack exchange,提问作者Kael
相关产品推荐
相关产品推荐

