JavaScript中多种情况的Switch语句

我需要在JavaScript中的Switch语句中使用多个案例,例如:

switch (varName){case "afshin", "saeed", "larry":alert('Hey');break;
default:alert('Default case');break;}

我怎么能这样做呢?如果在JavaScript中没有办法做到这一点,我想知道一个也遵循DRY概念的替代解决方案。

1024935 次浏览

使用switch语句的落空功能。匹配的大小写将运行到找到break(或switch语句的末尾),因此您可以这样写:

switch (varName){case "afshin":case "saeed":case "larry":alert('Hey');break;
default:alert('Default case');}

在Javascript中,要在一个开关中分配多个情况,我们必须定义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>

请参阅示例单击链接

以下是完全避免switch语句的不同方法:

var cases = {afshin: function() { alert('hey'); },_default: function() { alert('default'); }};cases.larry = cases.saeed = cases.afshin;
cases[ varName ] ? cases[ varName ]() : cases._default();

如果你使用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)中不起作用,但您可以相当容易地修补东西。有关更多信息,请参阅问题确定字符串是否在JavaScript中的列表中

您可以使用“”运算符…
它依赖于对象/哈希调用,因此它与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]()

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;}

在某些情况下,这使得代码更加紧凑。

<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 (true) {case (function(){ return true; })():alert('true');break;case (function(){ return false; })():alert('false');break;default:alert('default');}

这适用于常规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);

你可以这样写:

switch (varName){case "afshin":case "saeed":case "larry":alert('Hey');break;
default:alert('Default case');break;}

这要看情况。Switch计算一次且仅计算一次。在匹配时,所有后续的case语句直到“打破”射击,无论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;default:console.log('default');}})(); // returns onlymen onlywomen onlyadults
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

添加并澄清斯特凡诺的回答,您可以使用表达式动态设置Switch中条件的值,例如:

var i = 3switch (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

开关语句中执行多个情况的另一种方法,当在函数中时:

function name(varName){switch (varName) {case 'afshin':case 'saeed':case 'larry':return 'Hey';default:return 'Default case';}}
console.log(name('afshin')); // Hey

我这样使用它:

switch (true){case /Pressure/.test(sensor):{console.log('Its pressure!');break;}
case /Temperature/.test(sensor):{console.log('Its temperature!');break;}}

我可以看到这里有很多很好的答案,但是如果我们需要检查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'));

上述方法的问题是,每次调用具有switch的函数时,您都必须重复几个case。更健壮的解决方案是拥有地图字典

下面是一个例子:

// The Map, divided by conceptsvar 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'],'mile': [2, 'mi', 'miles'],'nordicMile': [3, 'Nordic mile', 'mil (10 km)', 'Scandinavian mile']},fuelAmount: {'ltr': [1, 'l', 'litre', 'Litre', 'liter', 'Liter'],'gal (imp)': [2, 'imp gallon', 'imperial gal', 'gal (UK)'],'gal (US)': [3, 'US gallon', 'US gal'],'kWh': [4, 'KWH']}};
// This function maps every input to a certain defined valuefunction 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+'"')}
// You would use it simply like thismapUnit("fuelAmount", "ltr") // => ltrmapUnit("fuelAmount", "US gal") // => gal (US)mapUnit("fuelAmount", 3) // => gal (US)mapUnit("distance", "kilometre") // => km
// Now you can use the switch statement safely without the need// to repeat the combinations every time you call the switchvar foo = 'monthly'switch (mapUnit ('timePeriod', foo)) {case 'month':console.log('month')breakcase 'twoMonths':console.log('twoMonths')breakcase 'trimester':console.log('trimester')breakcase 'semester':console.log('semester')breakcase 'year':console.log('year')breakdefault:throw Error('error')}

你可以这样做:

alert(["afshin","saeed","larry","sasha","boby","jhon","anna",// ...].includes(varName)? 'Hey' : 'Default case')

或者只是一行代码:

alert(["afshin", "saeed", "larry",...].includes(varName)? 'Hey' : 'Default case')

和ErikE的回答相比有了一点进步

其中一个可能的解决方案是:

const names = {afshin: 'afshin',saeed: 'saeed',larry: 'larry'};
switch (varName) {case names[varName]: {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;}

我的处境类似于:

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 case总是。如果您遇到类似的多case 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');}

我喜欢这个清晰和DRY语法。

varName = "larry";
switch (true){case ["afshin", "saeed", "larry"].includes(varName) :alert('Hey');break;
default:alert('Default case');
}

一些有趣的方法。对我来说,最好的解决方法是使用.find

您可以通过在查找函数中使用合适的名称来指示多个案例是什么。

switch (varName){case ["afshin", "saeed", "larry"].find(firstName => firstName === varName):alert('Hey');break;
default:alert('Default case');break;}

其他答案更适合给定的例子,但如果你有多个案例,这是最好的方法。

用更干净的方法来处理

if (["triangle", "circle", "rectangle"].indexOf(base.type) > -1){//Do something}else if (["areaMap", "irregular", "oval"].indexOf(base.type) > -1){//Do another thing}

您可以对具有相同结果的多个值执行此操作