成绩字母编号

时间:2019-07-02 19:39:08

标签: javascript arrays loops iterator

作为我的编码训练营的最新任务,我们被要求创建一个函数,该函数将数字数组作为参数并将其输出到字母等级数组。我被卡住了!

我尝试重新设计和重构代码,更改程序不同部分的位置,通过MDN查看...

    let grades = []

    function getLetterGrades(grades) {
      let grade = grades.map 
      if (grade < 60) {
       return "F";
      } else if (grade < 70) {
        return "D";
      } else if (grade < 80) {
        return "C";
      } else if (grade < 90) {
        return "B";
      } else if (grade < 100) {
        return "A";
      }
      console.log(grades);
    }

    getLetterGrades([95, 85, 71]);

结果只会输出我在函数调用中输入的数字。

4 个答案:

答案 0 :(得分:3)

您使用的.map()错误。您正在做的是将map方法与数字进行比较。您什么都没有执行。

function getLetterGrades(grades) {
  return grades.map(function(grade) {
    if (grade < 60) {
      return "F";
    } else if (grade < 70) {
      return "D";
    } else if (grade < 80) {
      return "C";
    } else if (grade < 90) {
      return "B";
    } else if (grade < 100) {
      return "A";
    }
  });
}

var letters = getLetterGrades([95, 85, 71]);
console.log(letters)

答案 1 :(得分:1)

看看这个解决方案:

let grades = []

function getLetterGrades(grades) {
  // add an array (grade) that will hold the output
  let grade = []
  // iterate over grades with forEach()
  grades.forEach(item => {
    // item will be equal 95 on the first iteration
    // 85 on the second, and 71 on the third - these
    // values come from the passed 'grades' parameter
    if (item < 60) {
      grade.push("F");
    } else if (item < 70) {
      grade.push("D");
    } else if (item < 80) {
      grade.push("C");
    } else if (item < 90) {
      grade.push("B");
    } else if (item < 100) {
      grade.push("A");
    }
  })

  // console.log(grade) - NOT grades!
  console.log(grade);
}

getLetterGrades([95, 85, 71]);

问题不在于您选择的方法-问题在于您没有完成功能。这是map()的另一种解决方案:

let grades = []

function getLetterGrades(grades) {

  let grade = grades.map(item => {
    if (item < 60) {
      return "F";
    } else if (item < 70) {
      return "D";
    } else if (item < 80) {
      return "C";
    } else if (item < 90) {
      return "B";
    } else if (item < 100) {
      return "A";
    }
  })

  // console.log(grade) - NOT grades!
  console.log(grade);
}

getLetterGrades([95, 85, 71]);

在这种情况下,forEach()map()之间的主要区别是map()返回一个NEW数组(这就是为什么您在函数正文中使用return值)和{ {1}}不需要(我们必须手动创建数组-forEach()-,然后将值推入该“手工”数组)。

如果不使用手动创建的数组而使用grade,请看下面的内容:

forEach()

(我使用了forEach()的第二个参数-这是索引)这不是很好的解决方案!为什么?我们通过在// THIS IS NOT A GOOD SOLUTION! // IT GIVES YOU THE ANSWER IN THIS SMALL EXAMPLE // (so you see that it's possible) // BUT IN ANY LARGER CODE THIS IS THE // 100% SURE SOURCE OF ERRORS. let grades = [] function getLetterGrades(grades) { grades.forEach((item, index) => { if (item < 60) { grades[index] = "F"; } else if (item < 70) { grades[index] = "D"; } else if (item < 80) { grades[index] = "C"; } else if (item < 90) { grades[index] = "B"; } else if (item < 100) { grades[index] = "A"; } }) // console.log(grades) - NOT grade! console.log(grades); } getLetterGrades([95, 85, 71]);中覆盖原始grades数组来“破坏”了它-请勿这样做

答案 2 :(得分:1)

您的主要问题是:

let grade = grades.map 

您没有使用.map调用()方法,因此grade结束了对本机map函数的引用。而且,该函数不是数字,因此所有条件都不成立,因此您继续通过if语句,并仅记录传入的数组。

相反,您必须调用.map()并提供其必需的参数(将为源数组中的每个项目调用的函数)。您的if语句应为该函数的主体:

let grades = []

    function getLetterGrades(grades) {
      let letterGrades = grades.map(function(grade){
        if (grade < 60) {
         return "F";
        } else if (grade < 70) {
          return "D";
        } else if (grade < 80) {
          return "C";
        } else if (grade < 90) {
          return "B";
        } else if (grade < 100) {
          return "A";
        }      
      }); 

      console.log(letterGrades);
    }

    getLetterGrades([95, 85, 71]);

答案 3 :(得分:0)

map()所述,

接受一个函数并在数组中的每个对象上运行一次。要明确您的使用方式:

function getLetterGrades(grade) {
  if (grade < 60) {
   return "F";
  } else if (grade < 70) {
    return "D";
  } else if (grade < 80) {
    return "C";
  } else if (grade < 90) {
    return "B";
  } else if (grade < 100) {
    return "A";
  }
}
x = [95, 85, 71];
//=> [A, B, C]
x.map(getLetterGrades); 

从功能上讲,这就是其他答案的作用,只是他们没有在命名方法。


帖子被编辑以更改链接,因为注释指出了更好的资源。