Как мне преобразовать это выражение if / else в идиоматический JavaScript? - PullRequest
4 голосов
/ 14 апреля 2019

Я пытаюсь написать более идиоматический JavaScript.Я слышал от нескольких экспертов (например, Дугласа Крокфорда), что лучше избегать как можно большего числа операторов switch / case и сложных if / else, используя вместо этого объекты и функции.

Я пытаюсьвыяснить, как переписать этот блок if / else с использованием объектов и функций:

function testString(input){
    if (input.match(/\.$/)){
        return 'This string ends in a period.';
    } else if (input.match(/!$/)){
        return 'This string ends in an exclamation point.';
    } else {
        return 'This string has some other ending.';
    }
}

Теперь я знаю, что вы можете заменить if / else объектом:

let response = {
    'Now, it\'s a good time.':'This sentence ends in a period.',
    'What up!':'This sentence ends in an exclamation point.'
};

return response[input];

ПроблемаУ меня есть то, что я знаю, как использовать эту структуру только с литералами.Как выполнить сопоставление с регулярным выражением в левой части (ключ) пары ключ-значение?

Это не работает:

let response = {
    input.match(/\.$/):'This sentence ends in a period.',
    input.match(/!$/):'This sentence ends in an exclamation point.'
};

return response[input];

Это дает мне ошибку:

Unexpected token, expected ","

Ответы [ 2 ]

3 голосов
/ 14 апреля 2019

Вы можете создать таблицу поиска (шаблон для ответа):

 const responses = [
  { pattern: /\.$/, response: "This sentence ends in a period", },
  //...
  { pattern: /.*/, response: "Nothing special", }
];

return responses.find(it => input.match(it.pattern)).response;

Но, честно говоря: это слишком много усилий, вложенных в несколько строк кода, а скорее сосредоточиться на общей картине. Используете ли вы здесь if / else или приведенное выше решение на самом деле не имеет значения.

0 голосов
/ 14 апреля 2019

Я бы не посчитал эти три случая как " сложные операторы if / else ", с этим кодом все в порядке.Если вы получите больше из них, вы можете использовать справочную таблицу:

function testString(input){
    const endings = {
        '.': 'ends in a period.',
        '!': 'ends in an exclamation point.';
    };
    const last = input.slice(-1);
    return 'This string ' + (last in endings ? endings[last] : 'has some other ending.');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...