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

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分却显示通过的根本原因。

修复方案

  1. 修正字段名:把调用setRemark时的final_grade改成finalGrade,确保传入正确的最终成绩:
newData["remark"] = this.setRemark(newData["finalGrade"], newData["removal_grade"]);
  1. 额外优化建议:
    • 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:15:39