Javascript 函数返回“未定义”

问题描述

我编写了一个函数,它以分数为参数并返回字母等级。 编写代码时需要遵循一些条件。即:return 'A' if 25 < score <= 30 return 'B' if 20 < score <= 25 等等。所以我想通过省略很多 if-else's 来做到这一点。由于我是 javascript 新手,这就是我所能想到的:

// This function takes nested arrays and a single number,// which checks its availability in 
// the inside array and then return the index of the array
function my_index(arr,score) {
    for (const [index,elem] of arr.entries()) {
        if (elem.includes(score)) {
            return index;
        }
        
    }
}

// function to get letter grade
function getGrade(score) {
    let grade;
    var gradeDict = {
        'A': [26,27,28,29,30],'B': [21,22,23,24,25],'C': [16,17,18,19,20],'D': [11,12,13,14,15],'E': [6,7,8,9,10],'F': [0,1,2,3,4,5] 
    }
    var keys = Object.keys(gradeDict);
    var values = [Object.values(gradeDict)]
    grade = keys[my_index(values,score)]
        
    return grade;
}

一个函数工作正常。它返回嵌套数组的索引。但是主函数 getGrade 恰好返回 'Undefined'。想不出比这更好的解决方案来减少一堆丑陋的 if-else。

var question = {
    '1st': 'Can anybody help me get this done?','2nd': 'Is there any better way to do this?'
}

解决方法

有没有更好的写法?

我愿意:

function getLetterGrade(score) {
  return ['F','F','E','D','C','B','A'][Math.ceil(score / 5)];
}

F 出现两次,因为映射到 F 的分数比映射到其他等级的分数要多)

它可能有点神秘,但如果可能的分数发生变化,则更容易调整。

,

移除 [] 的外部 Object.values 数组。 Object.values 已返回 array 中的值。

来自

var values = [Object.values(gradeDict)];

var values = Object.values(gradeDict);

工作示例:

function my_index(arr,score) {
  for (const [index,elem] of arr.entries()) {
    if (elem.includes(score)) {
      return index;
    }
  }
}

function getGrade(score) {
  let grade;
  var gradeDict = {
    A: [26,27,28,29,30],B: [21,22,23,24,25],C: [16,17,18,19,20],D: [11,12,13,14,15],E: [6,7,8,9,10],F: [0,1,2,3,4,5],};
  var keys = Object.keys(gradeDict);
  var values = Object.values(gradeDict);
  grade = keys[my_index(values,score)];

  return grade;
}

console.log(getGrade(5));
console.log(getGrade(25));

替代解决方案

function getGrade(score) {
  let grade;
  var gradeDict = {
    A: [26,};

  for (let key in gradeDict) {
    if (gradeDict[key].includes(score)) return key;
  }

  return "Not found";
}

console.log(getGrade(5));
console.log(getGrade(25));

,

我喜欢之前提出的 ceil 解决方案,但这里是另一个通用解决方案,以防万一:

function grade(score) {
  if (score < 0 || score > 30) throw RangeError(`Score ${score} out of range`);

  for (let ii = 5; ii >= 0; ii--) {
    if (score > 5*ii) return String.fromCharCode(70 - ii);
  }

  return 'F';
}

console.log(0,'=>',grade(0))   // F
console.log(4,grade(4))   // F
console.log(6,grade(6))   // E
console.log(10,grade(10)) // E
console.log(27,grade(27)) // A
console.log(30,grade(30)) // A

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...