我如何为以下条件写一个开关?
如果url包含“foo”,则设置。Base_url是"bar"。
以下是实现所需的效果,但我有一种感觉,这将更易于管理的开关:
var doc_location = document.location.href;
var url_strip = new RegExp("http:\/\/.*\/");
var base_url = url_strip.exec(doc_location)
var base_url_string = base_url[0];
//BASE URL CASES
// LOCAL
if (base_url_string.indexOf('xxx.local') > -1) {
settings = {
"base_url" : "http://xxx.local/"
};
}
// DEV
if (base_url_string.indexOf('xxx.dev.yyy.com') > -1) {
settings = {
"base_url" : "http://xxx.dev.yyy.com/xxx/"
};
}
可能太迟了,但我喜欢这个,以防万一。
function extractParameters(args) {
function getCase(arg, key) {
return arg.match(new RegExp(`${key}=(.*)`)) || {};
}
args.forEach((arg) => {
console.log("arg: " + arg);
let match;
switch (arg) {
case (match = getCase(arg, "--user")).input:
case (match = getCase(arg, "-u")).input:
userName = match[1];
break;
case (match = getCase(arg, "--password")).input:
case (match = getCase(arg, "-p")).input:
password = match[1];
break;
case (match = getCase(arg, "--branch")).input:
case (match = getCase(arg, "-b")).input:
branch = match[1];
break;
}
});
};
你可以更进一步,传递一个选项列表,用|处理正则表达式
除非你在做全字符串匹配,否则你不能在开关中这么做;这是在做子字符串匹配。(正如Sean在评论中指出的那样,这并不完全正确。见末尾注释。)
如果你很高兴你的正则表达式在顶部剥离了所有你不想在你的匹配中比较的东西,你不需要一个子字符串匹配,可以这样做:
switch (base_url_string) {
case "xxx.local":
// Blah
break;
case "xxx.dev.yyy.com":
// Blah
break;
}
...但同样,这只适用于你匹配的完整字符串。如果base_url_string是“yyy.xxx”,则会失败。而您当前的代码将与“xxx. Local”中的匹配。本地”分支。
更新:好的,所以技术上你可以使用开关进行子字符串匹配,但我不建议在大多数情况下。以下是如何做到的(活生生的例子):
function test(str) {
switch (true) {
case /xyz/.test(str):
display("• Matched 'xyz' test");
break;
case /test/.test(str):
display("• Matched 'test' test");
break;
case /ing/.test(str):
display("• Matched 'ing' test");
break;
default:
display("• Didn't match any test");
break;
}
}
这是因为JavaScript switch语句的工作方式,特别是两个关键方面:首先,case是按照源文本的顺序考虑的,其次,选择器表达式(关键字case后面的位)是在case计算时计算的表达式(而不是像其他一些语言中的常量)。既然我们的测试表达式为真,那么第一个结果为真的case表达式就会被使用。