如何将此if / else语句转换为惯用JavaScript?

时间:2019-04-14 16:40:09

标签: javascript javascript-objects

我正在尝试编写更多惯用的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 个答案:

答案 0 :(得分:3)

您可以创建一个查找表(响应模式):

 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还是上面的解决方案并不重要。

答案 1 :(得分:0)

我不会将这三种情况视为“ 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.');
}