Javascript 制作一个计算总GPA的函数

Javascript 制作一个计算总GPA的函数,javascript,Javascript,好吧,那么我假设取一系列的分数,然后计算平均绩点。它总是像Nan一样出现,我忘了如何改变它。。。我也不认为我的GPA变量是正确的。 函数必须包含一个包含字母等级数组的参数,例如[A+,A-,C,B-,A] 该函数必须找到当前GPA var letter = ""; var GPA; function calculateTotalGPA(letter) { var counter = 0; for (var i = 0; i < letter.length; i+

好吧,那么我假设取一系列的分数,然后计算平均绩点。它总是像Nan一样出现,我忘了如何改变它。。。我也不认为我的GPA变量是正确的。 函数必须包含一个包含字母等级数组的参数,例如[A+,A-,C,B-,A] 该函数必须找到当前GPA

 var letter = "";
 var GPA;

 function calculateTotalGPA(letter) {
     var counter = 0;
     for (var i = 0; i < letter.length; i++) {
         if (letter == "A+") {
             GPA = 4;
             counter++;
         }
         if (letter == "A") {
             GPA = 4;
             counter++;

         }
         if (letter == "A-") {
             GPA = 3.67;
             counter++;
         }
         if (letter == "B+") {
             GPA = 3.33;
             counter++;
         }
         if (letter == "B") {
             GPA = 3;
             counter++;
         }
         if (letter == "B-") {
             GPA = 2.67;
             counter++;
         }
         if (letter == "C+") {
             GPA = 2.33;
             counter++;
         }
         if (letter == "C") {
             GPA = 2;
             counter++;
         }
         if (letter == "C-") {
             GPA = 1.67;
             counter++;
         }
         if (letter == "D") {
             GPA = 1;
             counter++;
         }
         if (letter == "F") {
             GPA = 0;
             counter++;
         }
     }
     return (GPA / counter);
 }

有更好的方法来编写这段代码,但我认为显示当前代码的错误比建议完全不同的东西更有用

在if语句中,您正在检查字母是否等于字符串,但字母是否是字符串数组,因此您希望检查循环索引i处的元素

i、 e.变化

if (letter == "A+") {

您希望在除以计数器之前计算总GPA点数,但当前您在每次迭代时重置GPA

改变

 GPA = 4;

还是速记

 GPA += 4;
在进入for循环之前,还要初始化变量

 var GPA = 0;

正如评论中提到的,您还可以做其他事情来优化代码。

请允许我提供一些建议,首先,我看不出您的for语句有什么意义,它与计算无关。变量letter和GPA的范围似乎很奇怪,这两个变量在计算函数的范围之外,可能最好至少在计算函数内移动GPA声明

关于计算函数本身,我的建议是创建一个JSON对象,并像使用字典一样使用它,这类似于键值对象,例如:

var GPAs = {
   "A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
};
然后您可以使用字母像数组一样访问它们:

您的整个功能将如下所示:

function calculateGPA(letter) {
    var GPAs = {
       "A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
    };
   return GPAs[letter];
}
要从数组中获取总数,有多种方法可以实现,其中一种方法是使用array.prototype.reduce,例如:

["A", "A"].reduce(function(a,letter){ 
         a=a+calculateGPA(letter); return a;
},0);
将CalculatePatotal函数缩减为类似以下内容:

function calculateGPATotal(arrayOfLetters){
     var GPAs = {
       "A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
    };
     return arrayOfLetters.reduce(function(a,letter){  a=a+GPAs[letter]; return a;},0) / arrayOfLetters.length;
  } 

请注意,我使用的是ArayaFoLeLeTe.Stand而不是计数器,这似乎是出于同样的目的。

考虑使用一个数组……考虑使用一个开关盒。字母。长度可以保存到一个变量。@标记ToTalpPa和CurrungGPA的确切含义?我建议你离开计算机并找出如何做。手工计算。例如,如果你得到A、B+和B,那么GPA是多少?如果你可以手工操作,你将更容易找出你的代码有什么错误。几乎正确,但他的输入是一个数组,他需要根据他当前的代码计算平均GPA,我认为需要计数器,并且需要循环遍历数组字母,因为OP在input中描述为字母数组grades@andrex我更新了答案,纠正了这个被忽略的关于阵列的细节。这是一个非常高级的答案,对于初学者来说很困惑,但是如果它能起到作用,我会保证。天哪,谢谢!我似乎总是相当接近我的所有代码,然后只是忘记了一些小的方面,把我搞砸了
function calculateGPA(letter) {
    var GPAs = {
       "A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
    };
   return GPAs[letter];
}
["A", "A"].reduce(function(a,letter){ 
         a=a+calculateGPA(letter); return a;
},0);
function calculateGPATotal(arrayOfLetters){
     var GPAs = {
       "A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
    };
     return arrayOfLetters.reduce(function(a,letter){  a=a+GPAs[letter]; return a;},0) / arrayOfLetters.length;
  }