【问题标题】:number to grade letter数字到等级字母
【发布时间】:2019-11-13 11:45:07
【问题描述】:

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

我尝试过重新处理和重构我的代码,更改程序不同部分的位置,查看 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]);

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

【问题讨论】:

  • let grade = grades.map 那么函数在哪里呢? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 这很有帮助!谢谢!
  • 如果有人得到100分会怎样?甚至获得奖励积分?你也应该解决100 &lt;= grade 的情况! :) (或者在最后一个 else if 处添加 90 &lt;= grade 而不是 grade &lt; 100。)

标签: javascript arrays loops iterator


【解决方案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() 返回一个新数组(这就是为什么你在函数体中 return 值),而 forEach() 没有(我们有手动创建数组 - grade-,并将值推送到这个“手工”数组中)。

看看下面会发生什么,如果我们使用 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]);

(我使用了 forEach() 的第二个参数 - 那是索引)这不是一个好的解决方案! 为什么?我们通过覆盖 getLetterGrades() 来“破坏”我们原来的 grades 数组 - 不要这样做

【讨论】:

  • 你应该试着解释一下它是如何工作的,这对提问的人会更有益。
  • 亲爱的@DanielTurcich - 我先添加解决方案,然后添加解释。现在看看 sn-p。
【解决方案2】:

您使用 .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)

【讨论】:

    【解决方案3】:

    您的主要问题是:

    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]);

    【讨论】:

      【解决方案4】:

      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); 
      

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


      帖子已编辑以更改链接,因为评论指出了更好的资源。

      【讨论】:

      • 帮自己一个忙,尽可能远离 W3Schools。众所周知,信息不完整、不准确和/或过时。相反,请使用 Mozilla 开发者网络。
      猜你喜欢
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      相关资源
      最近更新 更多