Javascript第二个条件不起作用,计算平均然后更改为字母等级

时间:2014-01-22 13:30:48

标签: javascript average

我一直在努力在这段代码中找到这个bug几天。是的,我是新手。我正在尝试计算平均值,然后将数字输出转换为字母等级。请帮忙!我的输出反映了平均值正在计算,但只有一个条件正在生成字母等级。

var courtesyVal = 0,
overallVal = 0,
i;

if (data.length) {

for (i = 0; i < data.length; i++) {

    courtesyVal += data[i].grade_courtesy;
    overallVal += data[i].grade_overall;

}

courtesyVal = (courtesyVal / data.length);
overallVal = (overallVal / data.length);

}


if (courtesyVal >= 4 || overallVal >= 4) {
courtesyVal = ("A") || overallVal("A");
} else if (courtesyVal >= 3 || overallVal >= 3) {
courtesyVal = ("B") || overallVal("B");
} else if (courtesyVal >= 2 || overallVal >= 2) {
courtesyVal = ("C") || overallVal("C");
} else if (courtesyVal >= 1 || overallVal >= 1) {
courtesyVal = ("D") || overallVal("D");
} else {
courtesyVal = ("F") || overallVal("F");
}

Appery("courtesy_grade").text(courtesyVal);
Appery("overall_grade").text(overallVal);

3 个答案:

答案 0 :(得分:1)

||正在短路,因此如果第一个条件评估为true,则不评估第二个条件。既然你在做作业而不是条件,我认为你根本不想要||。您也可能不希望将overallVal称为函数。试试这个:

courtesyVal = "A";
overallVal = "A";

甚至更短:

courtesyVal = overallVal = "A";

答案 1 :(得分:1)

当您指定字母等级时,您使用OR(||)来分隔您的作业。您需要使用由分号(;)分隔的2个单独的赋值语句。

if (courtesyVal >= 4 || overallVal >= 4) {
    courtesyVal = "A";
    overallVal = "A";
} 
else if (courtesyVal >= 3 || overallVal >= 3) {
    courtesyVal = "B";
    overallVal = "B";
} 
else if (courtesyVal >= 2 || overallVal >= 2) {
    courtesyVal = "C";
    overallVal = "C";
} 
else if (courtesyVal >= 1 || overallVal >= 1) {
    courtesyVal = "D"; 
    overallVal = "D";
} 
else {
    courtesyVal = "F"; 
    overallVal = "F";
}

答案 2 :(得分:1)

代码有两个问题:一个是严重的,一个是微妙的。

严重的问题是您的语法将overallVal视为一种功能。 overallVal("A")尝试使用第一个参数overallVal调用'A'函数。这将导致错误。

微妙的问题会掩盖上面的严重问题,因为您已将courtesyVal的值分配给'A' || overallVal('A')。幸运或不幸的是,最后一部分未经评估,因此从未达到上述错误,'A'已分配给courtesyVal

<强>解决方案

替换:

courtesyVal = ("A") || overallVal("A");

使用:

courtesyVal = "A";
overallVal = "A";

有一个问题浮现在脑海中,为什么要为这两个变量分配相同的值?如果您想将数字等级转换为字母等级,那么您的做法是错误的。你应该为每个变量执行一次if()elses序列。

更好的方法是使用一些数学函数:

var correspondence = "FDCBAA"; // last A is for a perfect 5
var courtesyVal = 0, overallVal = 0;    

if (data.length) {
  for (var i = 0; i < data.length; i++) {
    courtesyVal += data[i].grade_courtesy;
    overallVal += data[i].grade_overall;
  }

  courtesyVal = (courtesyVal / data.length);
  overallVal = (overallVal / data.length);
}

courtesyVal = correspondence[Math.floor(courtesyVal)];
overallVal = correspondence[Math.floor(overallVal)];