据我所知,代码工作正常,但是当添加或编辑更多信息时,if else语句开始表现得很奇怪。它正确读取了百分比值,但没有返回正确的字母字符串。
var total = function (){
var earned = 0;
for(i = 0; i < Assignments.length; i++){
earned += parseInt(Assignments[i].earned);
}
var possible = 0;
for(i = 0; i < Assignments.length; i++){
possible += parseInt(Assignments[i].possible);
}
var percent = (Math.floor((earned/possible) * 100));
console.log(percent);
//grade letter
if (percent >= 90){
grade.innerHTML = '';
grade.innerHTML = 'A ' + percent + '%';
} else if (percent <= 89 && 80 >= percent){
grade.innerHTML = '';
grade.innerHTML = 'B ' + percent + '%';
} else if (percent <= 79 && 70 >= percent){
grade.innerHTML = '';
grade.innerHTML = 'C ' + percent + '%';
} else if (percent <= 69 && 60 >= percent){
grade.innerHTML = '';
grade.innerHTML = 'D ' + percent + '%';
} else if(percent <= 59 && 0 >= percent){
grade.innerHTML = '';
grade.innerHTML = 'F ' + percent + '%';
} else {grade.innerHTML = '';}
};
在几次输入后,它将返回如下内容:
我认为如果陈述冲突可能是其他的,但老实说,我不知道为什么这样做会这样。
答案 0 :(得分:6)
您在else if
s后面进行了比较,您使用70 >= percent
而不是percent >= 70
(依此类推)。
另外,如果您要为其分配其他内容,则没有理由将''
分配给innerHTML
,并且没有理由重申上限(percent <= 89
等),因为您正在使用else if
,因此percent >= 90
分支已经被跟踪。重申它们也是一个维护问题(你将改变一个但忘记改变另一个)。
所以:
if (percent >= 90) {
grade.innerHTML = 'A ' + percent + '%';
} else if (percent >= 80) {
grade.innerHTML = 'B ' + percent + '%';
} else if (percent >= 70) {
grade.innerHTML = 'C ' + percent + '%';
} else if (percent >= 60) {
grade.innerHTML = 'D ' + percent + '%';
} else if (percent >= 0) {
grade.innerHTML = 'F ' + percent + '%';
} else {
grade.innerHTML = '';
}
当然,您可以使用地图,因为您的等级边界可以被10整除:
// Somewhere central
var grades = {
6: 'D',
7: 'C',
8: 'B',
9: 'A',
10: 'A'
};
// ...then simply:
if (percent >= 0) {
grade.innerHTML = (grades[Math.floor(percent / 10)] || 'F') + ' ' + percent + '%';
} else {
grade.innerHTML = "Less than 0?!";
}
var grades = {
6: 'D',
7: 'C',
8: 'B',
9: 'A',
10: 'A'
};
function showGrade(percent) {
var grade;
if (percent >= 0) {
grade = (grades[Math.floor(percent / 10)] || 'F') + ' ' + percent + '%';
} else {
grade = "Less than 0?!";
}
snippet.log(grade);
}
var n;
for (n = 0; n <= 100; ++n) {
showGrade(n);
}
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
答案 1 :(得分:2)
If-Else
条件范围看错了,试试这段代码......
var total = function (){
var earned = 0, possible = 0;
for(i = 0; i < Assignments.length; i++){
possible += parseInt(Assignments[i].possible);
earned += parseInt(Assignments[i].earned);
}
var percent = (Math.floor((earned/possible) * 100));
console.log(percent);
//grade letter
if (percent >= 90){
grade.innerHTML = 'A ' + percent + '%';
} else if (percent >= 80 && percent <= 89){
grade.innerHTML = 'B ' + percent + '%';
} else if (percent >= 70 && percent <= 79){
grade.innerHTML = 'C ' + percent + '%';
} else if (percent >= 60 && percent <= 69){
grade.innerHTML = 'D ' + percent + '%';
} else if(percent >= 0 && percent <= 59){
grade.innerHTML = 'F ' + percent + '%';
} else {grade.innerHTML = '';}
};
虽然我优化了一些代码,但不需要2个循环,你可以在单循环中求earned
,possible
变量,在元素中赋值时不需要.innerHTML = ''
。
答案 2 :(得分:0)
我使用不同的比较方法找到了关于效率的好文章。我仍然建议使用switch-block而不是if / else,但它在技术上并不比你的解决方案好,但我认为它更好阅读。这是一段代码:
switch (true) {
case (0 <= val && val < 1000): /* do something */ break;
case (1000 <= val && val < 2000): /* do something */ break;
...
case (29000 <= val && val < 30000): /* do something */ break;
}
取自这篇文章。还有一个有趣的表(在第一个答案中) Switch statement for greater-than/less-than 以及使这项工作的不同方法。我知道这实际上不是你的答案的解决方案,但是如果你需要添加更多的if / else并且正在使用值做一些巨大的列表,它可能会派上用场。