写下所有其他if语句有点乏味。是否有更简单的方法来编写以下代码?
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-'
&#13;
答案 0 :(得分:2)
较短的代码总是不是更好的代码。您可以使用ascii和一些数学技巧编写此代码的非常短的版本。但其他人不会在以后阅读。我认为 readablity 和性能是两个最重要的考虑因素。
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;
}
&#13;
score : <input id="scoreBox" type="text"/>
<input onclick="alert(convertScoreToGradeWithPlusAndMinus(scoreBox.value))" value="calculate" type="button"/>
&#13;
答案 1 :(得分:1)
首先要注意的是,如果条件为“true”,则函数返回。所以“else if”可以用简单的“if”代替......另一件事是因为你的范围是连续的,所以你真的不需要每次测试最大值和最小值:
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-'
我不知道你是否认为这不那么乏味?就个人而言,我首选的方法是将数据结构映射到值的限制,然后结束简单的循环,直到找到正确的值。
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";
}
你仍然有一个繁琐的工作来定义你的地图 - 我不认为你可以在这样的情况下避免它。
希望这有帮助!
答案 2 :(得分:0)
前一阵子回答了,但是我也遇到了这个问题。我认为以下内容为其他两个答案之间提供了一种很好的中间方法:
function convertScoreToGradeWithPlusAndMinus(score) {
if (score > 100 || score < 0) return "INVALID SCORE";
// sign logic
let sign = "";
if (score % 10 < 3) sign = "-";
if (score % 10 > 7 || score === 100) sign = "+";
// letter logic
if (score < 60) return "F";
if (score < 70) return "D" + sign;
if (score < 80) return "C" + sign;
if (score < 90) return "B" + sign;
return "A" + sign;
}