将分数转换为分级更简单。是否有更简单的方法来编写以下代码?

时间:2017-01-05 21:04:55

标签: javascript

写下所有其他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;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

较短的代码总是不是更好的代码。您可以使用ascii和一些数学技巧编写此代码的非常短的版本。但其他人不会在以后阅读。我认为 readablity 性能是两个最重要的考虑因素。

&#13;
&#13;
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;
&#13;
&#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;

}