我正在尝试编写更多惯用的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 ","
答案 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.');
}