我在JavaScript中的switch语句中需要多个案例,例如:
switch (varName)
{
case "afshin", "saeed", "larry":
alert('Hey');
break;
default:
alert('Default case');
break;
}
我该怎么做?如果在JavaScript中没有办法做类似的事情,我想知道一个替代DRY concept的替代解决方案。
答案 0 :(得分:1237)
使用switch
语句的直通功能。匹配的大小写将一直运行,直到找到break
(或switch
语句的结尾),因此您可以将其写为:
switch (varName)
{
case "afshin":
case "saeed":
case "larry":
alert('Hey');
break;
default:
alert('Default case');
}
答案 1 :(得分:70)
这适用于常规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);
干杯。
答案 2 :(得分:44)
这是完全避免switch
语句的不同方法:
var cases = {
afshin: function() { alert('hey'); },
_default: function() { alert('default'); }
};
cases.larry = cases.saeed = cases.afshin;
cases[ varName ] ? cases[ varName ]() : cases._default();
答案 3 :(得分:16)
在Js中为switch分配多个案例我们必须定义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
答案 4 :(得分:11)
如果您使用的是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。
答案 5 :(得分:8)
我的情况类似于:
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');
}
答案 6 :(得分:6)
添加并澄清Stefano的答案,您可以使用表达式以dinamically方式设置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');
}
虽然不是那么干......
答案 7 :(得分:6)
为清晰起见和DRY语法,我喜欢这样做。
varName = "larry";
switch (true)
{
case ["afshin", "saeed", "larry"].includes(varName) :
alert('Hey');
break;
default:
alert('Default case');
}
答案 8 :(得分:5)
您可以使用' 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
答案 9 :(得分:3)
取决于。 Switch只评估一次。在匹配时,所有后续的案例陈述直到&#39;不管案件说什么都会开火。
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
&#13;
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
&#13;
答案 10 :(得分:3)
我这样用:
switch (true){
case /Pressure/.test(sensor):{
console.log('Its pressure!');
break;
}
case /Temperature/.test(sensor):{
console.log('Its temperature!');
break;
}
}
答案 11 :(得分:3)
在节点中,您似乎可以这样做:
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;
}
在某些情况下,这会产生更紧凑的代码。
答案 12 :(得分:2)
switch (myVariable)
{
case "A":
case "B":
case "C":
// Do something
break;
case "D":
case "E":
// Do something else
break;
default:
// Default case
break;
}
在这个例子中,如果myVariable的值是A,B或C,它将在“C”的情况下执行代码:。
答案 13 :(得分:2)
我可以看到这里有很多好的答案,但是如果我们需要检查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'));
答案 14 :(得分:0)
上述方法的问题在于,每次调用具有case
的函数时,都必须重复几个switch
。更为强大的解决方案是使用地图或词典。
这里有个例子
// 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')
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
答案 15 :(得分:0)
您可以这样做:
alert([
"afshin",
"saeed",
"larry",
"sasha",
"boby",
"jhon",
"anna",
// ...
].includes(varName)? 'Hey' : 'Default case')
或仅一行代码:
alert(["afshin", "saeed", "larry",...].includes(varName)? 'Hey' : 'Default case')
ErikE的回答有一点改进
答案 16 :(得分:0)
可能的解决方案之一是:
const names = {
afshin: 'afshin',
saeed: 'saeed',
larry: 'larry'
};
switch (varName) {
case names[varName]: {
alert('Hey');
break;
}
default: {
alert('Default case');
break;
}
}
答案 17 :(得分:0)
对我来说,这是最简单的方法:
switch (["afshin","saeed","larry"].includes(varName) ? 1 : 2) {
case 1:
alert('Hey');
break;
default:
alert('Default case');
break;
}
答案 18 :(得分:0)
您可以尝试
function theTest(val) {
var answer = "";
switch( val ) {
case (1 || 2 || 3):
answer = "Low";
break;
case (4 || 5 || 6):
answer = "Mid";
break;
case (7 || 8 || 9):
answer = "High";
break;
default:
answer = "Massive or Tiny?";
}
return answer;
}
theTest(9);
答案 19 :(得分:0)
一些有趣的方法。对我来说,最好的解决方法是使用 .find
。
您可以通过在过滤器函数中使用合适的名称来指示多种情况是什么。
switch (varName)
{
case ["afshin", "saeed", "larry"].find(firstName => firstName === varName):
alert('Hey');
break;
default:
alert('Default case');
break;
}
其他答案更适合给定的示例,但如果您有多个案例,这是最好的方法。
答案 20 :(得分:-1)
在switch语句中执行多个case的另一种方法,当在函数内部时
function name(varName){
switch (varName) {
case 'afshin':
case 'saeed':
case 'larry':
return 'Hey';
default:
return 'Default case';
}
}
console.log(name('afshin')); //Hey
&#13;
答案 21 :(得分:-2)
你可以这样写:
switch (varName)
{
case "afshin":
case "saeed":
case "larry":
alert('Hey');
break;
default:
alert('Default case');
break;
}
答案 22 :(得分:-3)
ListView
答案 23 :(得分:-5)
只需切换开关条件aprroach
switch (true) {
case (function(){ return true; })():
alert('true');
break;
case (function(){ return false; })():
alert('false');
break;
default:
alert('default');
}