给GPA转换的信

时间:2015-08-03 19:00:03

标签: javascript jquery

当我将字母输入转换为数字然后将其传递给另一个总计并平均它们的函数时,我收到NaN返回。我的转换功能或我调用函数的方式有问题吗?

function CalcGPA(a, b, c, d, e, f, g, h, i, j) {
    var initial = a + b + c + d + e + f + g + h + i + j;
    var total = initial / 10;
    return total;
}

function Convert(z) {
    var x = z.toString().toUpperCase();
    switch (x.value) {
        case "A":
            return 4.0;
        case "A-":
            return 3.67;
        case "B+":
            return 3.33;
        case "B":
            return 3.0;
        case "B-":
            return 2.67;
        case "C+":
            return 2.33;
        case "C":
            return 2.0;
        case "C-":
            return 1.7;
        case "D+":
            return 1.3;
        case "D":
            return 1.0;
        case "F":
            return 0;
    }
}

$(document).ready(function () {
    var input2 = $('[name="grade1"],[name="grade2"],[name="grade3"],[name="grade4"],[name="grade5"],[name="grade6"],[name="grade7"],[name="grade8"],[name="grade9"],[name="grade10"],[name="grade11"]');

    input2.keyup(function () {
        var total2;
        Convert((input2[0]));
        Convert((input2[1]));
        Convert((input2[2]));
        Convert((input2[3]));
        Convert((input2[4]));
        Convert((input2[5]));
        Convert((input2[6]));
        Convert((input2[7]));
        Convert((input2[8]));
        Convert((input2[9]));
        total2 = CalcGPA(input2[0], input2[1], input2[2], input2[3], input2[4], input2[5], input2[6], input2[7], input2[8], input2[9]);
        total2.toFixed(2);
        $(input2[10]).val(total2);
    });
});

2 个答案:

答案 0 :(得分:0)

回答您的问题:

您没有在任何地方存储Convert()来电的价值,因此当您拨打CalcGPA()时,您只需将原始字母成绩发送到该功能中。

为了让您的代码更好:

我还强烈建议您重新考虑从各种输入字段中收集值并在计算中使用它们的方式。

例如,我首先在输入中应用一个公共类。这样就可以有1个输入或20个输入,你可以编写代码来处理任何事情。

假设我为每个输入命名为gradeLetterInput

然后您可以像这样重写$(document).ready()CalcGPA()函数:

$(document).ready(function () {
    // get collection of inputs
    var $gradeLetterInputs = $('.gradeLetterInput');
    var gpaValues = $.map($gradeLetterInputs, function($item, idx) {
        return Convert($item.val());
    });
    var gpaAvg = CalcGPA(gpaValues);
    // not shown place avg GPA on DOM somwhere
}

function CalcGPA(arr) {
    var total = 0;
    var count = arr.length;
    for (i=0;i<count;i++) {
        total += arr[i];
    }
    return total/count;
}

每当你看到自己依赖于id或输入名称(如something#)或者为一组类似项目的函数调用添加一堆参数时,你应该认识到这是一种反模式,并试着考虑一下如何重构代码以消除此类使用。

答案 1 :(得分:0)

对通过在数组元素上运行Convert()获得的值调用CalcGPA。或者,将“转换”值存储到临时变量,然后使用它们作为参数调用CalcGPA。像这样的东西 -

function CalcGPA(a, b, c, d, e, f, g, h, i, j) {
    var initial = a + b + c + d + e + f + g + h + i + j;
    var total = initial / 10;
    return total;
}

function Convert(z) {
    var x = z.toString().toUpperCase();
    switch (x.value) {
        case "A":
            return 4.0;
        case "A-":
            return 3.67;
        case "B+":
            return 3.33;
        case "B":
            return 3.0;
        case "B-":
            return 2.67;
        case "C+":
            return 2.33;
        case "C":
            return 2.0;
        case "C-":
            return 1.7;
        case "D+":
            return 1.3;
        case "D":
            return 1.0;
        case "F":
            return 0;
    }
}

$(document).ready(function () {
    var input2 = $('[name="grade1"],[name="grade2"],[name="grade3"],[name="grade4"],[name="grade5"],[name="grade6"],[name="grade7"],[name="grade8"],[name="grade9"],[name="grade10"],[name="grade11"]');

    input2.keyup(function () {
        var total2;
        total2 = CalcGPA(Convert(input2[0]), Convert(input2[1]), Convert(input2[2]), Convert(input2[3]), Convert(input2[4]), Convert(input2[5]), Convert(input2[6]), Convert(input2[7]), Convert(input2[8]), Convert(input2[9]));
        total2.toFixed(2);
        $(input2[10]).val(total2);
    });
});