所以我们这里有我的GPA计算器代码。我已经把所有内容排成一行,但我似乎无法弄清楚为什么我的IF ELSE声明停止并将所有字母等级转换为值“4”。
我已经尝试将语句放在处理等级的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>
答案 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中进行分配。
同样 Andy 指出,在评论中你的for
循环都使用相同的index i
,这可能会给你带来麻烦(至少不是一个好习惯) 。如果为循环创建一个新的变量for
,那会更好。目前还不清楚你想用for
循环实现什么,但我认为它也可以用单for
循环完成。
答案 1 :(得分:2)
它无法正常工作的原因是因为在if
语句中,您使用的是单个等号。单个等于将grades[i]
设置为等于'A' - 它实际上并未评估grades[i] == 'A'
。
答案 2 :(得分:1)
正如在其他答案中指出的那样,您应该使用比较运算符==
而不是在=
条件中分配运算符if
,并且不要忘记grades[i]
是DOM对象而不是一些普通值 - 因此您必须与此对象的某些属性进行比较(如果要与输入的文本进行比较,请使用value
属性)
if (grades[i].value == "A"){
gVals.push("4");
}
else if (grades[i].value == "B"){
gVals.push("3");
}