2013-11-23 74 views
1

所以我們這裏有我的GPA計算器代碼。我得到了一切符合,但我似乎無法弄清楚爲什麼我的IF ELSE聲明停止並將所有字母等級轉換爲「4」的值。Javascript IF ELSE statement stops short

我試圖把語句外的for循環時處理等級和他們推到到gVals []我試圖把它們完全的功能之外在自己的功能。我已經嘗試了很多不同的東西,除了顯然是有用的東西。

我知道有這樣做的簡單方法,但我試圖用最低限度的心態來執行這個應用程序。

代碼:

function calcGPA() { 
    //Variable Sections 
    var grades = document.querySelectorAll("#letGrade input[type=text]"); 
    var contacts = document.querySelectorAll("#conHours input[type=text]"); 
    var gVals = []; 
    var cVals = []; 
    var failGrade = "The Letter Grade input may only be capitol letters A,B,C,D or F"; 
    var failHours = "The Contact Hours input may only be 1, 2, 3, 4 or 5"; 
    var checkGrade = /^[ABCDF]/; 
    var checkhours = /^[12345]/; 
    //Grab the Letter grades and process them 
    //Should validate all inputs in the letGrade div to capitol A, B, C, D or F 
    //Should Convert all inputs in the LetGrade div to A = 4,B = 3,C = 2,D = 1,F = 0 
    //Should push resulting conversion to gVals[] 
    for (var i = 0; i < grades.length; i++) { 
     if (!checkGrade.test(grades[i].value)) { 
      alert(failGrade); 
      return false; 
     } 
      if (grades[i].value == "A"){ 
       gVals.push("4"); 
      } 
      else if (grades[i].value == "B"){ 
       gVals.push("3"); 
      } 
      else if (grades[i].value == "C"){ 
       gVals.push("2"); 
      } 
      else if (grades[i].value == "D"){ 
       gVals.push("1"); 
      } 
      else if (grades[i].value == "F"){ 
       gVals.push("0"); 
      } 
     //Should validate all inputs in the conHours div to 1, 2, 3, 4 or 5 
     //Should push all resulting values to cVals[] 
     if (!checkhours.test(contacts[i].value)) { 
      alert(failHours); 
      return false; 
     } 
     cVals.push(contacts[i].value); 
    } 
    console.log(gVals, cVals); 
    document.getElementById("cumGPA").innerHTML = (gVals[0] * cVals[0]); 
}; 

我遇到的問題是,IF ELSE語句來完成從字母等級質量點值的轉換,其產生的字母匹配它的恢復一切恢復爲4,而不是等級組件。

感謝您的任何幫助,這在高級和請,如果你能不直接回答這個問題,請解釋一下我哪裏錯了,所以我可以學習一下。

編輯:添加HTML爲繁榮!和「固定」JAVASCRIPT!

<div id="calcWrapper"> 
    <form id="calc" name="calc" onsubmit="calcGPA(); return false;"> 
     <div id="letGrade"> 
      <input tabindex="1" type="text" maxlength="1" placeholder="Letter Grade..." /> 
      <input tabindex="3" type="text" maxlength="1" placeholder="Letter Grade..." /> 
      <input tabindex="5" type="text" maxlength="1" placeholder="Letter Grade..." /> 
      <input tabindex="7" type="text" maxlength="1" placeholder="Letter Grade..." /> 
      <input tabindex="9" type="text" maxlength="1" placeholder="Letter Grade..." /> 
      <input tabindex="11" type="text" maxlength="1" placeholder="Letter Grade..." /> 
      <label>Cumulative GPA:</label><output id="cumGPA" type="text" /> 
     </div> 
     <div id="conHours"> 
      <input tabindex="2" type="text" maxlength="1" placeholder="Contact Hours..." /> 
      <input tabindex="4" type="text" maxlength="1" placeholder="Contact Hours..." /> 
      <input tabindex="6" type="text" maxlength="1" placeholder="Contact Hours..." /> 
      <input tabindex="8" type="text" maxlength="1" placeholder="Contact Hours..." /> 
      <input tabindex="10" type="text" maxlength="1" placeholder="Contact Hours..." /> 
      <input tabindex="12" type="text" maxlength="1" placeholder="Contact Hours..." /> 
      <input type="submit" value="Calculate" /> 
     </div> 
    </form> 
</div> 
+2

它可能有一些做與使用嵌套的循環,兩個循環使用值'i'作爲指標。 – Andy

+1

另外,我不清楚爲什麼嵌套循環是必要的。當然,人們會做的伎倆。 – Andy

+1

@安迪: - 是的,那肯定會有訣竅! ;) –

回答

1

正如有人指出在其他的答案,你應該在if條件下使用比較操作==,而不是賦值運算符=的,也不要忘記,grades[i]是DOM對象,而不是一些純的價值觀 - 讓你有一些比較這個屬性的對象(如果你想與輸入的文字使用value財產比較)

 if (grades[i].value == "A"){ 
      gVals.push("4"); 
     } 
     else if (grades[i].value == "B"){ 
      gVals.push("3"); 
     } 
+0

好,所以我這樣做了,這是有道理的,我沒有調用任何實際可用的值進行比較。然而,考慮到這一點,並添加它,以及擺脫嵌套的for循環,現在我仍然只有4個返回所有的letGrade輸入,無論進入他們什麼。它將所有內容都評估爲4,而不是將其更改爲應該的內容。 –

+1

你能檢查'console.log(等級[i] .value)'和'console.log(等級[i] .value ==「A」)'顯示什麼,只是把它放在'if's之前 – VitaliyG

+0

那麼你有它。我必須查看所有這些,並且發現如果是這樣,我將它們全部設置爲靜止。謝謝!!!!!答案有兩部分完成。 –

2

你想改變單一===比較

if (grades[i] == 'A'){ 

像這樣的事情在你的代碼:

if (grades[i] == 'A'){ 
      gVals.push("4"); 
     } 
     else if (grades[i] == 'B'){ 
      gVals.push("3"); 
     } 
     else if (grades[i] == 'C'){ 
      gVals.push("2"); 
     } 
     else if (grades[i] == 'D'){ 
      gVals.push("1"); 
     } 
     else if (grades[i] == 'F'){ 
      gVals.push("0"); 
     } 

注: -

Double equality ==使用用於比較,single =用於Javascript中的賦值。

另外,作爲安迪也指出,在評論你的兩個for迴路都使用相同的index i這可能會導致問題,你(ATLEAST不是一個好的做法)。如果爲循環創建一個新變量for秒會更好。目前還不清楚你想用for這兩個循環來實現什麼,但我認爲它也可以用單個for循環完成。

+1

我要求賠償至少一半你的答案! :) – Andy

+1

@安迪: - 沒有那麼清楚。是我錯過了什麼,或者在我的回答中寫錯了什麼? –

2

之所以它不工作是因爲在你if聲明,您使用的是單一的平等。一個等於是設置grades[i]等於'A' - 它實際上並沒有評估grades[i] == 'A'