Как назначить новое значение в случае переключателя, который в функции? - PullRequest
1 голос
/ 29 января 2020

В настоящее время пишется функция, которая преобразует числовую оценку в американскую систему. В основном результат должен быть таким:

Вы получили D (60%)!

Но я получаю это:

У вас есть 60 60%!

Кроме скобок, что я должен сделать, чтобы он выглядел максимально возможным?

код ниже:

function gradeConverting(grade) {
    let gradePercent = grade + "%";
    switch (grade) {
        case (90 < grade && grade <= 100):
            grade = "A";
            break;
        case (80 < grade && grade <= 89):
            grade = "B";
            break;
        case (70 < grade && grade <= 79):
            grade = "C";
            break;
        case (60 <= grade && grade <= 69):
            grade = "D";
            break;
        case (50 <= grade && grade <= 59):
            grade = "E";
            break;
        case (grade <= 49):
            grade = "F";
            break;
    }
    return console.log("You got a " + grade + " " + gradePercent + "!");
}

gradeConverting(55);

Ответы [ 3 ]

2 голосов
/ 29 января 2020

Лог c вашего кода полностью действителен, но вы неправильно используете switch().

проверьте do c about: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch

если вы поставите switch(grade), то something в case something будет ожидать value, который соответствует grade вместо expression, который возвращает true|false

Например:

switch (grade) {
        case 90: // only for grade === 90
            grade = "A";
            break;
        case 55: // only for grade === 55
        ...

Действительно, у вас может быть функция с множественным оператором if, а затем возвращаться lettergrade. Или по-прежнему использовать текущие логи c с некоторыми изменениями и по-прежнему использовать switch().

Я создаю другую переменную для lettergrade, рекомендую не изменять grade, если вы не знаете, что пытаетесь сделать.

function gradeConverting(grade) {
    let gradePercent = grade + "%";
    var lettergrade = ""; 
    switch (true) { // change to true 
        case (90 <= grade && grade <= 100):
        // you want (90 <= grade && grade <= 100) to be evaluated as true in order to execuate
            lettergrade = "A";
            break;
        case (80 <= grade && grade <= 89):
            lettergrade = "B";
            break;
        case (70 <= grade && grade <= 79):
            lettergrade = "C";
            break;
        case (60 <= grade && grade <= 69):
            lettergrade = "D";
            break;
        case (50 <= grade && grade <= 59):
            lettergrade = "E";
            break;
        case (grade <= 49):
            lettergrade = "F";
            break;
    }
    return console.log("You got a " + lettergrade + " (" + gradePercent + ")!");
}

gradeConverting(100);
0 голосов
/ 30 января 2020

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch

Документы MDN являются одним из лучших ресурсов для этих типов Javascript проблем с синтаксисом!

Но по сути оператор переключения в Javascript будет принимать только одно последующее выражение, но несколько результатов этого выражения.

Что в каждом конкретном случае c вы можете повлиять на этот результат.

switch (value) {
    case 1:
        // do something for value == 1
        break;
    case 2:
        // do something for value == 1
        break;
    //...
}
0 голосов
/ 30 января 2020

Вы неправильно используете оператор switch.

Обычно он используется с фиксированными значениями, например

switch (value) {
    case 1:
        // do something for value == 1
        break;
    case 2:
        // do something for value == 1
        break;
    //...
}

Кроме того, для некоторых значений преобразование не выполняется (90 , 80 и 70), поскольку у вас есть странные проверки границ с использованием непоследовательных < и <=. (Измените > на >= в приведенном ниже коде, если вам нужно включить младшие десятки)

В вашем случае последовательность if / else кажется более подходящей:

function gradeConverting(grade) {
    let gradePercent = grade + "%";
    let americanGrade
    // note: you should probably specify what happens if grade > 100
    if (grade > 90) {
        americanGrade = "A";
    } else if (grade > 80) {
        americanGrade = "B";
    } else if (grade > 70) {
        americanGrade = "C";
    } else if (grade > 60) {
        americanGrade = "D";
    } else if (grade > 50) {
        americanGrade = "E";
    } else {
        americanGrade = "F";
    }
    return console.log("You got a " + americanGrade + " " + gradePercent + "!");
}

gradeConverting(55);

Обратите внимание, что вы можете сократить код, например, так:

function toAmericanGrade(grade) {
    if (grade < 50) {
        return "F";
    } else if (grade >= 100) {
        return "A";
    }
    // `"F".charCodeAt(0) - 1 + 5` = `74`
    return String.fromCharCode(74 - Math.floor((grade)/10))
}

function gradeConverting(grade) {
    let gradePercent = grade + "%";
    let americanGrade = toAmericanGrade(grade)
    return console.log("You got a " + americanGrade + " " + gradePercent + "!");
}

gradeConverting(55);

// test
for(let i = 45; i <= 100; i++) {
    gradeConverting(i);
}
...