微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Javascript 函数返回“未定义”

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。