【问题标题】:JavaScript: Numerical Grade to Letter GradeJavaScript:数字等级到字母等级
【发布时间】:2017-07-18 11:21:32
【问题描述】:

1. 创建一个 toLetterGrade 函数,该函数接受一个百分比数组并返回一个对应等级字母的数组。例如:

toLetterGrade([90,80,55,85]); //returns ["A","A-","C","A"]

2. 创建一个 toGradePoints 函数,该函数接受一个字母等级数组并返回相应的等级分数数组。例如:

toGradePoints(["A","A-","C","A"]); //returns [4.0,3.7,2.0,4.0]

3. 创建一个函数 GPA,它采用百分比数组并返回相应的平均成绩。

我正在尝试执行数字 1,这是我目前拥有的代码,但它只给了我数组中最后一个数字的字母等级。我做错了什么?

var arr

function toLetterGrade(arr) {
    for (i = 0; i < arr.length; i++) {
        if (arr[i] >= 85) {
            textG = "A";
        } else if (arr[i] >= 80) {
            textG = "A-";
        } else if (arr[i] >= 75) {
            textG = "B+";
        } else if (arr[i] >= 70) {
            textG = "B";
        } else if (arr[i] >= 65) {
            textG = "B-";
        } else if (arr[i] >= 60) {
            textG = "C+";
        } else if (arr[i] >= 55) {
            textG = "C";
        } else if (arr[i] >= 50) {
            textG = "D";
        } else {
            textG = "F";
        }
    }
    return textG;
}

document.write(toLetterGrade([90, 80, 70]))

输出为 B。

【问题讨论】:

  • 请添加第二个问题的数字是从哪里得到的。

标签: javascript arrays loops conditional


【解决方案1】:

对于第一部分,您可以使用一个对象并迭代所需成绩的键。

function getGrade(p) {
    var grade = 'F';
    Object.keys(grades).some(function (k) {
        if (p >= grades[k]) {
            grade = k;
            return true;
        }
    });
    return grade
}

var grades = { A: 85, 'A-': 80, B: 70, 'B-': 65, 'C+': 60, C: 55, D: 50, F: '' }

console.log([90, 80, 55, 85].map(getGrade));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • @dv,请说明原因。
  • 有人刚刚疯了,每一个条目都被 dv 了。顺便说一句,在这里使用像Object.keys 这样的现代解决方案有点毫无意义,因为 OP 甚至无法创造正确的条件。
  • 即使op实际上无法理解,我认为编写具有一些高级功能的解决方案是必要的。连续 dv 可能有一个议程,它是隐藏的,因此只有破坏性。
  • 同意。我赞成你的回答,-1 看起来不太好。 (:
  • @Kinduser:Object.keys() 已成为标准并已发布超过 5 年...
【解决方案2】:

每次迭代都会覆盖返回值。

尝试创建一个数组,然后将解决方案添加到数组中。

var solutionArr = [];

solutionArr.push("A");

jsfiddle

【讨论】:

    【解决方案3】:

    您在循环的每个循环中都覆盖了您的变量,这就是为什么您只得到一个 - 最后一个成绩。

    我建议你使用一个空数组变量来存储结果。

    对于每个循环,您将为textG 变量分配新等级,然后将其推入result 数组。 textG 变量在每个循环 textG = '' 时都会被重置,因此没有复制/覆盖结果的风险。

    for 循环的所有循环之后,返回result 数组。

    function toLetterGrade(arr) {
      var textG = '';
      var result = [];
      for (i = 0; i < arr.length; i++) {
        textG = '';
        if (arr[i] >= 85) {
          textG = "A";
        } else if (arr[i] >= 80) {
          textG = "A-";
        } else if (arr[i] >= 75) {
          textG = "B+";
        } else if (arr[i] >= 70) {
          textG = "B";
        } else if (arr[i] >= 65) {
          textG = "B-";
        } else if (arr[i] >= 60) {
          textG = "C+";
        } else if (arr[i] >= 55) {
          textG = "C";
        } else if (arr[i] >= 50) {
          textG = "D";
        } else {
          textG = "F";
        }
        result.push(textG);
      }
      return result;
    }
    
    document.write(toLetterGrade([90, 80, 70]))

    【讨论】:

      【解决方案4】:

      您将等级分配给一个变量,然后在每次迭代中覆盖它。

      改用 textG.push('A')

      【讨论】:

        猜你喜欢
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多