Оператор Switch не возвращает желаемое значение - PullRequest
2 голосов
/ 12 мая 2019

Я пытаюсь вернуть 'Can drink' или 'Wait' на основе массива ages, но что-то не так с моим оператором switch, я получаю 'Try again'.

var yearsArr = [1992, 1980, 2004, 2010];

function getAge(arr, fn) {
    var arrRes = [];
    for(var i = 0; i < arr.length; i++) {
        arrRes.push(fn(arr[i]));
    }
    return arrRes;
}

function calcAge(el) {
    return 2019 - el;
}

var ages = getAge(yearsArr, calcAge);
console.log(ages);

function canDrink(el) {
    switch(el) {
        case el >= 18:
            return 'Drink'
        break;
        case el < 18:
            return 'Wait'
        break;
        default:
            return 'Try again!'
    }
}

var drinkArr = getAge(ages, canDrink);
console.log(drinkArr);
// result = ["Try again!", "Try again!", "Try again!", "Try again!"]

Ответы [ 3 ]

4 голосов
/ 12 мая 2019

Вам необходимо использовать true в качестве значения для проверки результатов case деталей.

switch (true) {    // <---------------------for--+
    case el >= 18: // -> returns a boolean value-+
3 голосов
/ 12 мая 2019

Я бы использовал оператор if / else вместо switch в этом случае.: -)

// Returns the age for a birthYear
function getAge(birthYear) {
    return (new Date()).getFullYear() - birthYear;
}

// Returns the tapper's response for an age value
function getTapperResponse(age) {
    if (age >= 18) {
        return 'Drink';
    } else {
        return 'Wait';
    }
}

const birthYears = [1992, 1980, 2004, 2010];

const ages = birthYears.map(by => getAge(by));
console.log(ages);

const tapperResponses = ages.map(a => getTapperResponse(a));
console.log(tapperResponses);
3 голосов
/ 12 мая 2019

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

Давайте представим, что используя некоторые значения, мы вызываем canDrink с параметром 17.

function canDrink(el) { //Receives 17
    switch (el) { //Handles 17 as main value
        case el >= 18: // 17 >= 18 is false, but true===17 is false
            return 'Drink'
            break;
        case el < 18: // 17<18 is true, but false===17 is false
            return 'Wait'
            break;
        default: // So, none of the conditions matches default executes.
            return 'Try again!'
    }
}

Как вы должны адаптировать это?

function canDrink(el) { // el = 17
    switch (true) { // We use true as our main value
        case el >= 18: // 17>=18 is false, so our main value true === false, not executed
            return 'Drink'
            break;
        case el < 18: // 17<18 is true, so true===true, executes this.
            return 'Wait'
            break;
        default:// No need for default.
            return 'Try again!'
    }
}

Вы можете проверить этот рабочий пример .

...