JavaScript:数字成绩转换为字母成绩

3

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

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

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

toGradePoints(["A","A-","C","A"]); //返回[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。


请问第二个问题的数字是从哪里获取的? - Nina Scholz
5个回答

1
你正在每个循环周期中覆盖变量,这就是为什么你只得到一个 - 最后一个成绩的原因。
我建议你使用一个空数组变量来存储结果。
每次循环时,你将新的成绩分配给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]))


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,请添加原因。 - Nina Scholz
有人刚刚发疯了,把每个条目都删除了。顺便说一句,在这里使用像 Object.keys 这样的现代解决方案有点毫无意义,因为 OP 甚至不能正确地设置条件。 - kind user
1
即使操作者实际上无法理解这个想法,我认为有必要编写一个带有一些高级功能的解决方案。串行 DV 可能会有一个隐藏的而仅具破坏性的议程。 - Nina Scholz
1
@Kinduser:Object.keys() 已经标准化并用于生产超过5年了... - dandavis
@ДаниилПронин,这取决于一个已排序的对象。 - Nina Scholz
显示剩余3条评论

0

你正在将成绩分配给一个变量,然后在每次迭代中都进行覆盖。

尝试使用textG.push('A')代替。


0

你正在每次迭代中覆盖你的返回值。

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

var solutionArr = [];

solutionArr.push("A");

jsfiddle


0
我写了这个简单的代码来将数字转换为字母等级。
const letterGrade = (n) => {
  let resultGrade = "";
  if (n >= 90) {
    resultGrade = "A";
  } else if (n >= 80 || n > 89) {
    resultGrade = "B";
  } else if (n >= 70 || n > 79) {
    resultGrade = "C";
  } else if (n >= 60 || n > 69) {
    resultGrade = "D";
  } else if (n < 59) {
    resultGrade = "E";
  } else {
    alert("Input your grade first");
  }
  return `Your grade is ${resultGrade}`;
};

console.log(letterGrade(75));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接