我在JavaScript中的switch语句中需要多个case,比如:
switch (varName)
{
case "afshin", "saeed", "larry":
alert('Hey');
break;
default:
alert('Default case');
break;
}
我怎样才能做到这一点?如果在JavaScript中没有办法做类似的事情,我想知道一个替代解决方案也遵循DRY concept。
使用switch
语句的fall-through功能。一个匹配的大小写将一直运行,直到找到break
(或switch
语句的结尾),所以你可以这样写:
switch (varName)
{
case "afshin":
case "saeed":
case "larry":
alert('Hey');
break;
default:
alert('Default case');
}
我用这样的:
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'));
你可以这样做:
alert([
"afshin",
"saeed",
"larry",
"sasha",
"boby",
"jhon",
"anna",
// ...
].includes(varName)? 'Hey' : 'Default case')
或者只是一行代码:
alert(["afshin", "saeed", "larry",...].includes(varName)? 'Hey' : 'Default case')
ErikE的答案略有改进
上述方法的问题在于,每次调用具有case
的函数时,必须重复几个switch
s。更强大的解决方案是拥有地图或字典。
这是一个例子
// the Map, divided by concepts
var dictionary = {
timePeriod: {
'month': [1, 'monthly', 'mensal', 'mês'],
'twoMonths': [2, 'two months', '2 motnhs', 'bimestral', 'bimestre'],
'trimester': [3, 'trimesterly', 'quarterly', 'trimestral'],
'semester': [4, 'semesterly', 'semestral', 'halfyearly'],
'year': [5, 'yearly', 'anual', 'ano']
},
distance: {
'km': [1, 'kms', 'kilometre', 'kilometers', 'kilometres'],
'mile': [2, 'mi', 'miles'],
'nordicMile': [3, 'nordic mile', 'mil(10km)', '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 value
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+'"')
}
//you would use it simply like this
mapUnit("fuelAmount", "ltr") // => ltr
mapUnit("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 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':
console.log('semester')
break
case 'year':
console.log('year')
break
default:
throw Error('error')
}
在switch语句中执行多个case的另一种方法,当在函数内部时
function name(varName){
switch (varName) {
case 'afshin':
case 'saeed':
case 'larry':
return 'Hey';
default:
return 'Default case';
}
}
console.log(name('afshin')); //Hey
你可以像这样写:
switch (varName)
{
case "afshin":
case "saeed":
case "larry":
alert('Hey');
break;
default:
alert('Default case');
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
语句的不同方法:
var cases = {
afshin: function() { alert('hey'); },
_default: function() { alert('default'); }
};
cases.larry = cases.saeed = cases.afshin;
cases[ varName ] ? cases[ varName ]() : cases._default();
在Js中为switch分配多个case我们必须定义different case without break
,如下所示:
<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
如果您使用的是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');
}
请注意,这在旧的IE浏览器中不起作用,但您可以相当容易地修补。有关更多信息,请参阅问题determine if string is in list in javascript。
添加和澄清Stefano的答案,您可以使用表达式动态设置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');
}
虽然不是那么干......
你可以使用'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 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]()
享受,ZEE
在节点中,您似乎可以执行此操作:
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评估一次且仅评估一次。在匹配时,所有后续的案例陈述直到“休息”为止,无论案件如何说明。
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>