[英]Odd behavior with else if statement (javascript)
據我所知,代碼可以正常工作,但是當添加或編輯更多信息時,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 = '';}
};
輸入幾次后,它將返回如下內容:
我認為如果陳述有沖突,那可能是其他情況,但老實說,我不知道為什么這樣做。
如果else if
s, else if
在else if
向后進行比較,您使用的是70 >= percent
而不是percent >= 70
(依此類推)。
另外,如果要為其分配其他內容,則沒有理由將''
分配給innerHTML
,也沒有理由重復上限( percent <= 89
等),因為您正在使用else if
,因此percent >= 90
的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); }
<!-- 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>
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 = ''
。
我發現使用不同的比較方法的方法可以提高效率。 我仍然建議使用開關塊而不是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語句,用於表示大於/小於和使用不同的方法來實現此目的。 我知道這實際上不是您的答案的解決方案,但是如果您需要添加更多if / else並使用值來做一些巨大的列表,它可能會派上用場。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.