我在 JavaScript 中的 switch 语句中需要多个案例,例如:
switch (varName)
{
case "afshin", "saeed", "larry":
alert('Hey');
break;
default:
alert('Default case');
break;
}
我怎样才能做到这一点?如果没有办法在 JavaScript 中做类似的事情,我想知道一个也遵循 DRY concept 的替代解决方案。
使用 switch
语句的贯穿功能。匹配的案例将一直运行,直到找到 break
(或 switch
语句的结尾),因此您可以将其编写为:
switch (varName)
{
case "afshin":
case "saeed":
case "larry":
alert('Hey');
break;
default:
alert('Default case');
}
这适用于常规 JavaScript:
function theTest(val) {
var answer = "";
switch( val ) {
case 1: case 2: case 3:
answer = "Low";
break;
case 4: case 5: case 6:
answer = "Mid";
break;
case 7: case 8: case 9:
answer = "High";
break;
default:
answer = "Massive or Tiny?";
}
return answer;
}
theTest(9);
case (1||2||3):
等同于 case 1:
(因为 1||2||3
评估为 1
)。
这是完全避免 switch
语句的不同方法:
var cases = {
afshin: function() { alert('hey'); },
_default: function() { alert('default'); }
};
cases.larry = cases.saeed = cases.afshin;
cases[ varName ] ? cases[ varName ]() : cases._default();
switch ... case
的一个容易出错的功能。忘记 break
语句太容易了,如果您有意使用 fall through,那些忘记的 break
语句可能很难被发现。这个方法查找版本还有很多switch ... case
所缺乏的强大功能,比如动态扩展性,或者完全替换对象来完成模式切换的能力。它也更容易保持整洁,并且可以导致更可维护的代码。请参阅ericleads.com/2012/12/switch-case-considered-harmful
break
时,我总是添加注释 //fallthrough
来代替 break
。这有助于识别何时是错误以及何时是故意的。
在 Javascript 中,要在一个 switch 中分配多个 case,我们必须定义 different case without break inbetween
,如下所示:
<script>
function checkHere(varName){
switch (varName)
{
case "saeed":
case "larry":
case "afshin":
alert('Hey');
break;
case "ss":
alert('ss');
break;
default:
alert('Default case');
break;
}
}
</script>
请参阅点击 link 的示例
为了清晰起见,我喜欢这个 DRY 语法。
varName = "larry";
switch (true)
{
case ["afshin", "saeed", "larry"].includes(varName) :
alert('Hey');
break;
default:
alert('Default case');
}
如果你使用 ES6,你可以这样做:
if (['afshin', 'saeed', 'larry'].includes(varName)) {
alert('Hey');
} else {
alert('Default case');
}
或者对于早期版本的 JavaScript,您可以这样做:
if (['afshin', 'saeed', 'larry'].indexOf(varName) !== -1) {
alert('Hey');
} else {
alert('Default case');
}
请注意,includes
在某些浏览器(包括较旧的 IE 版本)中不起作用,但您可以相当轻松地进行修补。有关详细信息,请参阅问题 determine if string is in list in javascript。
includes
词获得更好的语义?任你选。
我的情况类似于:
switch (text) {
case SOME_CONSTANT || ANOTHER_CONSTANT:
console.log('Case 1 entered');
break;
case THIRD_CONSTANT || FINAL_CONSTANT:
console.log('Case 2 entered');
break;
default:
console.log('Default entered');
}
default
案例总是输入。如果您遇到类似的多案例 switch 语句问题,您正在寻找这个:
switch (text) {
case SOME_CONSTANT:
case ANOTHER_CONSTANT:
console.log('Case 1 entered');
break;
case THIRD_CONSTANT:
case FINAL_CONSTANT:
console.log('Case 2 entered');
break;
default:
console.log('Default entered');
}
添加并澄清Stefano's answer,您可以使用表达式动态设置switch中条件的值,例如:
var i = 3
switch (i) {
case ((i>=0 && i<=5) ? i : -1):
console.log('0-5');
break;
case 6: console.log('6');
}
因此,在您的问题中,您可以执行以下操作:
var varName = "afshin"
switch (varName) {
case (["afshin", "saeed", "larry"].indexOf(varName)+1 && varName):
console.log("hey");
break;
default:
console.log('Default case');
}
虽然是这么多DRY...
varName
会很有趣,希望您缓存 varName。
在 Node.js 中,您似乎可以这样做:
data = "10";
switch(data){
case "1": case "2": case "3": // Put multiple cases on the same
// line to save vertical space.
console.log("small");
break;
case "10": case "11": case "12":
console.log("large");
break;
default:
console.log("strange");
break;
}
在某些情况下,这使得代码更加紧凑。
我这样使用它:
switch (true){
case /Pressure/.test(sensor):
{
console.log('Its pressure!');
break;
}
case /Temperature/.test(sensor):
{
console.log('Its temperature!');
break;
}
}
g
标志,因为您只使用了一次正则表达式并将它们丢弃。事实上,如果您将它们保留在函数之外,g
标志会通过尝试从后续 .test(
上的非 0 索引匹配来伤害您。我还修复了一个错字,其中 switch case 位于 sensor
变量而不是 true
常量以匹配布尔表达式。见编辑。
case /officedocument/.test(type) && /presentation/.test(type): iconClass = "far fa-file-powerpoint red"; break;
视情况而定。 Switch 评估一次且仅一次。在匹配时,无论 case 说什么,直到“break”的所有后续 case 语句都会触发。
var onlyMen = true; var onlyWomen = false; var onlyAdults = false; (function(){ switch (true){ case onlyMen: console.log ('onlymen'); case onlyWomen: console.log ('onlyWomen'); case onlyAdults: console.log ('onlyAdults'); break; 默认值: console.log('default'); } })(); // 返回 onlymen onlywomen onlyadults
switch
是(不)著名的 goto
语句的变体。这个想法是你去这些标签之一,然后继续。也就是说,标签代表入口点;如果您想退出,您必须自己完成,使用 break
语句,或者如果您在函数内部,则可能使用 return
语句。
您可以使用“in”运算符...它依赖于对象/哈希调用,因此它与 JavaScript 一样快。
// Assuming you have defined functions f(), g(a) and h(a,b)
// somewhere in your code,
// you can define them inside the object, but...
// the code becomes hard to read. I prefer it this way.
o = { f1:f, f2:g, f3:h };
// If you use "STATIC" code can do:
o['f3']( p1, p2 )
// If your code is someway "DYNAMIC", to prevent false invocations
// m brings the function/method to be invoked (f1, f2, f3)
// and you can rely on arguments[] to solve any parameter problems.
if ( m in o ) o[m]()
一些有趣的方法。对我来说,最好的解决方法是使用 .find
。
您可以通过在 find 函数中使用合适的名称来指示多种情况。
switch (varName)
{
case ["afshin", "saeed", "larry"].find(firstName => firstName === varName):
alert('Hey');
break;
default:
alert('Default case');
break;
}
其他答案更适合给定的示例,但是如果您对我有多种情况,这是最好的方法。
你可以这样做:
alert([
"afshin",
"saeed",
"larry",
"sasha",
"boby",
"jhon",
"anna",
// ...
].includes(varName)? 'Hey' : 'Default case')
或者只是一行代码:
alert(["afshin", "saeed", "larry",...].includes(varName)? 'Hey' : 'Default case')
埃里克的回答有一点改进
我可以看到这里有很多很好的答案,但是如果我们需要检查超过 10 个案例会发生什么?这是我自己的方法:
function isAccessible(varName){
let accessDenied = ['Liam', 'Noah', 'William', 'James', 'Logan', 'Benjamin',
'Mason', 'Elijah', 'Oliver', 'Jacob', 'Daniel', 'Lucas'];
switch (varName) {
case (accessDenied.includes(varName) ? varName : null):
return 'Access Denied!';
default:
return 'Access Allowed.';
}
}
console.log(isAccessible('Liam'));
if (accessDenied.includes(varName)) return 'Access Denied!'; return 'Access Allowed.'
就足够了。
上述方法的问题在于,每次调用具有 switch
的函数时,您都必须重复几个 case
。一个更强大的解决方案是有一个地图或一个字典。
这是一个例子:
// 地图,除以概念 var dictionary = { timePeriod: { 'month': [1, 'monthly', 'mensal', 'mês'], 'twoMonths': [2, 'two months', '2 months ', 'bimestral', 'bimestre'], 'trimester': [3, 'trimesterly', ' Quarterly', 'trimestral'], 'semester': [4, 'semesterly', 'semestral', 'halfyearly'] , 'year': [5, 'yearly', 'annual', 'ano'] }, distance: { 'km': [1, 'kms', 'kilometre', 'kilometers', 'kilometres'], '英里':[2,'mi','miles'],'nordicMile':[3,'北欧英里','mil(10公里)','斯堪的纳维亚英里']},fuelAmount:{'ltr':[ 1, 'l', 'litre', 'Litre', 'liter', 'Liter'], 'gal (imp)': [2, 'imp gal', 'imperial gal', 'gal (UK)'] , 'gal (US)': [3, 'US gal', 'US gal'], 'kWh': [4, 'KWH'] } }; // 这个函数将每个输入映射到某个定义的值 function mapUnit (concept, value) { for (var key in dictionary[concept]) { if (key === value || dictionary[concept][key].indexOf( value) !== -1) { return key } } throw Error('Uknown "'+value+'" for "'+concept+'"') } // 你可以像这样使用它 mapUnit("fuelAmount", " ltr") // => ltr mapUnit("fuelAmount", "US gal") // => gal (US) mapUnit("fuelAmount", 3) // => gal (US) mapUnit("distance", " kmetre") // => km // 现在您可以安全地使用 switch 语句,而无需在每次调用 switch 时重复组合 // var foo = 'monthly' switch (mapUnit ('timePeriod', foo)) { case 'month': console.log('month') break case 'twoMonths': console.log('twoMonths') break case 'trimester': console.log('trimester') break case 'semester': 控制台。 log('semester') break case 'year': console.log('year') break default: throw Error('error') }
一种可能的解决方案是:
const names = {
afshin: 'afshin',
saeed: 'saeed',
larry: 'larry'
};
switch (varName) {
case names[varName]: {
alert('Hey');
break;
}
default: {
alert('Default case');
break;
}
}
在函数内部时,在 switch 语句中执行多个案例的另一种方法:
函数名(varName){ switch(varName){ case 'afshin': case 'saeed': case 'larry': return 'Hey';默认值:返回“默认情况”; } } console.log(name('afshin')); // 嘿
更清洁的处理方式
if (["triangle", "circle", "rectangle"].indexOf(base.type) > -1)
{
//Do something
}else if (["areaMap", "irregular", "oval"].indexOf(base.type) > -1)
{
//Do another thing
}
您可以对具有相同结果的多个值执行此操作
只需更改开关条件方法:
switch (true) {
case (function(){ return true; })():
alert('true');
break;
case (function(){ return false; })():
alert('false');
break;
default:
alert('default');
}
(expression)
在括号中,并且返回值必须是输入。看我的回答
switch(true) { case (var1 === 0 && var2 === true): {} }
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Example1</title>
<link rel="stylesheet" href="css/style.css" >
<script src="js/jquery-1.11.3.min.js" type="text/javascript"></script>
<script>
function display_case(){
var num = document.getElementById('number').value;
switch(num){
case (num = "1"):
document.getElementById("result").innerHTML = "You select day Sunday";
break;
case (num = "2"):
document.getElementById("result").innerHTML = "You select day Monday";
break;
case (num = "3"):
document.getElementById("result").innerHTML = "You select day Tuesday";
break;
case (num = "4"):
document.getElementById("result").innerHTML = "You select day Wednesday";
break;
case (num = "5"):
document.getElementById("result").innerHTML = "You select day Thusday";
break;
case (num = "6"):
document.getElementById("result").innerHTML = "You select day Friday";
break;
case (num = "7"):
document.getElementById("result").innerHTML = "You select day Saturday";
break;
default:
document.getElementById("result").innerHTML = "You select day Invalid Weekday";
break
}
}
</script>
</head>
<body>
<center>
<div id="error"></div>
<center>
<h2> Switch Case Example </h2>
<p>Enter a Number Between 1 to 7</p>
<input type="text" id="number" />
<button onclick="display_case();">Check</button><br />
<div id="result"><b></b></div>
</center>
</center>
</body>
switch
语句的工作方式。它只是 case "1":
,而不是 case (num = "1"):
。
document.getElementById("result").innerHTML = ....
在 switch 外,然后在最后添加日值结果?
num
但它仍然有效,因为 switch
已经被评估并且赋值产生了值。这是最好的变异/机器学习编程。
你可以这样写:
switch (varName)
{
case "afshin":
case "saeed":
case "larry":
alert('Hey');
break;
default:
alert('Default case');
break;
}
对我来说这是最简单的方法:
switch (["afshin","saeed","larry"].includes(varName) ? 1 : 2) {
case 1:
alert('Hey');
break;
default:
alert('Default case');
break;
}
if
语句即可。
switch('10') { case 1, '10': console.log('ok') }
打印ok
switch(1)
。这里的标签只是一个逗号表达式。