2017-01-05 1 views
0

Es ist etwas mühsam, alle anderen if-Anweisungen zu schreiben. Gibt es eine einfachere Möglichkeit, den folgenden Code zu schreiben?Konvertieren von Score zu Note einfacher. Gibt es eine einfachere Möglichkeit, den folgenden Code zu schreiben?

function convertScoreToGradeWithPlusAndMinus(score) { 
 
    // your code here 
 
    if(score <= 100 && score >= 98) return "A+"; 
 
    else if(score <= 97 && score >= 93) return "A"; 
 
    else if(score <= 92 && score >= 90) return "A-"; 
 
    else if(score <= 89 && score >= 88) return "B+"; 
 
    else if(score <= 87 && score >= 83) return "B"; 
 
    else if(score <= 82 && score >= 80) return "B-"; 
 
    else if(score <= 79 && score >= 78) return "C+"; 
 
    else if(score <= 77 && score >= 73) return "C"; 
 
    else if(score <= 72 && score >= 70) return "C-"; 
 
    else if(score <= 69 && score >= 68) return "D+"; 
 
    else if(score <= 67 && score >= 63) return "D"; 
 
    else if(score <= 62 && score >= 60) return "D-"; 
 
    else if(score <= 59 && score >= 0) return "F"; 
 
    else return "INVALID SCORE"; 
 
} 
 

 
var output = convertScoreToGradeWithPlusAndMinus(91); 
 
console.log(output); // --> 'A-'

Antwort

2

Kürzere Code ist nicht immer besser Code. Sie können eine sehr kurze Version dieses Codes schreiben, indem Sie ascii und einige mathematische Tricks verwenden. Aber es wird später von anderen nicht lesbar sein. Ich denke, readablity und Leistung sind zwei wichtigste Sache zu prüfen.

var limits = ['-','','+','+'] 
 
function convertScoreToGradeWithPlusAndMinus(score) { 
 
    if(score==100) return 'A+'; 
 
    if(score<59) return 'F'; 
 
    
 
    var lCode = 74 - Math.floor(score/10); 
 
    var sign = limits[Math.floor((score % 10)/3)] 
 
    return String.fromCharCode(lCode)+ sign; 
 
}
score : <input id="scoreBox" type="text"/> 
 

 
<input onclick="alert(convertScoreToGradeWithPlusAndMinus(scoreBox.value))" value="calculate" type="button"/>

+0

Brilliant. Jetzt wünschte ich, ich hätte daran gedacht. – MacPrawn

1

Das erste, was ist zu bemerken, dass, wenn eine Bedingung „wahr“ ist, Ihre Funktion zurückkehrt. So kann das "sonst wenn" durch einfaches "wenn" ersetzt werden. Das andere Ding ist, dass, da Ihre Bereiche ununterbrochen sind, Sie nicht wirklich jedes Mal für ein Maximum und ein Minimum prüfen müssen:

function convertScoreToGradeWithPlusAndMinus(score) { 
    if(score > 100 || score < 0) return "INVALID SCORE"; 
    if(score >= 98) return "A+"; 
    if(score >= 93) return "A"; 
    if(score >= 90) return "A-"; 
    if(score >= 88) return "B+"; 
    if(score >= 83) return "B"; 
    if(score >= 80) return "B-"; 
    if(score >= 78) return "C+"; 
    if(score >= 73) return "C"; 
    if(score >= 70) return "C-"; 
    if(score >= 68) return "D+"; 
    if(score >= 63) return "D"; 
    if(score >= 60) return "D-"; 
    return "F"; 
} 

var output = convertScoreToGradeWithPlusAndMinus(91); 
console.log(output); // --> 'A-' 

Ich weiß nicht, ob Sie das als weniger mühsam zählen? Persönlich ist mein bevorzugter Weg, eine Datenstruktur zu erstellen, die Grenzen auf Werte abbildet, und dann eine einfache Schleife darüber, bis ich den richtigen Wert gefunden habe.

function convertScoreToGradeWithPlusAndMinus(score) { 
    if(score > 100 || score < 0) return "INVALID SCORE"; 
    var map = [ 
     {max: 98, grade: "A+"}, 
     {max: 93, grade: "A"}, 
     {max: 90, grade: "A-"}, 
     {max: 88, grade: "B+"}, 
     {max: 83, grade: "B"}, 
     {max: 80, grade: "B-"}, 
     {max: 78, grade: "C+"}, 
     {max: 73, grade: "C"}, 
     {max: 70, grade: "C-"}, 
     {max: 68, grade: "D+"}, 
     {max: 63, grade: "D"}, 
     {max: 60, grade: "D-"} 
    ]; 
    for(var loop = 0; loop < map.length; loop++) { 
     var data = map[loop]; 
     if(score >= data.max) return data.grade; 
    } 
    return "F"; 
} 

Sie haben noch die mühsame Arbeit der Karte, obwohl der Definition - Ich glaube nicht, dass Sie es in einem Fall wie diesem zu vermeiden.

Hoffe, das hilft!

Verwandte Themen