I need multiple cases in switch statement in JavaScript, Something like:
switch (varName){ case "afshin", "saeed", "larry": alert('Hey'); break; default: alert('Default case'); break;}How can I do that? If there's no way to do something like that in JavaScript, I want to know an alternative solution that also follows theDRY concept.
- 1Sad that this syntax is not working :(Lars Flieger– Lars Flieger2021-08-26 11:46:10 +00:00CommentedAug 26, 2021 at 11:46
- 1the syntax is valid but it will only check on the last case, javascript should throw an error in such a caseIsaac Weingarten– Isaac Weingarten2023-03-22 21:24:42 +00:00CommentedMar 22, 2023 at 21:24
26 Answers26
Use the fall-through feature of theswitch statement. A matched case will run until abreak (or the end of theswitch statement) is found, so you could write it like:
switch (varName){ case "afshin": case "saeed": case "larry": alert('Hey'); break; default: alert('Default case');}10 Comments
switch('10') { case 1, '10': console.log('ok') } printsokswitch(1). The label here is just a comma expression.This works in regular #"dateCreated" datetime="2016-01-17 02:15:47Z">
7 Comments
case (1||2||3): is equivalent tocase 1: (since1||2||3 evaluates to1).Here's different approach avoiding theswitch statement altogether:
var cases = { afshin: function() { alert('hey'); }, _default: function() { alert('default'); }};cases.larry = cases.saeed = cases.afshin;cases[ varName ] ? cases[ varName ]() : cases._default();11 Comments
switch ... case. It's too easy to forget abreak statement, and if you use fall through intentionally, those forgottenbreak statements can be very hard to spot. This method lookup version also has lots of great features thatswitch ... case lacks, such as dynamic extensibility, or the ability to completely replace the object to accomplish mode switching. It's also easier to keep cleanly organized, and can lead to more maintainable code. Seeericleads.com/2012/12/switch-case-considered-harmful//fallthrough in place ofbreak whenever I intentionally omit thebreak. That helps to identify when it's a mistake and when it's intentional.In Javascript to assign multiple cases in a switch, we have to definedifferent case without break inbetween like given below:
<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>Please see example click onlink
1 Comment
I like this for clarity and aDRY syntax.
varName = "larry";switch (true){ case ["afshin", "saeed", "larry"].includes(varName) : alert('Hey'); break; default: alert('Default case');}3 Comments
if (true) you're sayingif ("true" == "true")If you're using ES6, you can do this:
if (['afshin', 'saeed', 'larry'].includes(varName)) { alert('Hey');} else { alert('Default case');}Or for earlier versions of JavaScript, you can do this:
if (['afshin', 'saeed', 'larry'].indexOf(varName) !== -1) { alert('Hey');} else { alert('Default case');}Note thatincludes won't work in some browser including older IE versions, but you could patch things up fairly easily. See the questiondetermine if string is in list in javascript for more information.
6 Comments
includes word? Take your pick.My situation was something akin to:
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');}Thedefault casealways entered. If you're running into a similar multi-case switch statement issue, you're looking for this:
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');}Comments
Adding and clarifyingStefano's answer, you can use expressions to dynamically set the values for the conditions in switch, e.g.:
var i = 3switch (i) { case ((i>=0 && i<=5) ? i : -1): console.log('0-5'); break; case 6: console.log('6');}So in your problem, you could do something like:
var varName = "afshin"switch (varName) { case (["afshin", "saeed", "larry"].indexOf(varName)+1 && varName): console.log("hey"); break; default: console.log('Default case');}Although it is so muchDRY...
1 Comment
varName inside the case expression, expect that varName is cached thou.In Node.js it appears that you are allowed to do this:
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;}This makes for much more compact code in some cases.
3 Comments
Here is one more easy-to-use switch case statement. which can fulfill your requirement. We can use the find method in the switch statement to get the desire output.
switch(varname){ case["afshin","saeed","larry"].find(name => name === varname): alert("Hey") break; default: alert('Default case'); break;}Comments
I use it like this:
switch (true){ case /Pressure/.test(sensor): { console.log('Its pressure!'); break; } case /Temperature/.test(sensor): { console.log('Its temperature!'); break; }}4 Comments
g flag, since you're only using the regexes once and throwing them away. In fact, if you were keeping them outside the function, theg flag would harm you by trying to match from a non-0 index on subsequent.test(s. I also fixed a typo where the switch case was onsensor variable and nottrue constant for matching boolean expressions. See the edit.case /officedocument/.test(type) && /presentation/.test(type): iconClass = "far fa-file-powerpoint red"; break;Some interesting methods. For me the best way to solve is using.find.
You can give an indication of what the multiple cases are by using a suitable name inside your find function.
switch (varName){ case ["afshin", "saeed", "larry"].find(firstName => firstName === varName): alert('Hey'); break; default: alert('Default case'); break;}Other answers are more suitable for the given example but if you have multiple cases to me this is the best way.
1 Comment
It depends.Switch evaluates once and only once. Upon a match, all subsequent case statements until 'break' fire no matter what the case says.
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>1 Comment
switch is a variation of the (in)famousgoto statement. The idea is that you go to one of these labels, and then continue. That is, the labels represent entry points; if you want to exit, you have to do it yourself, with either thebreak statement or possibly areturn statement if you’re inside a function.You can use the 'in' operator...
It relies on the object/hash invocation, so it's as fast as JavaScript can be.
// 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]()3 Comments
You can do this:
alert([ "afshin", "saeed", "larry", "sasha", "boby", "jhon", "anna", // ...].includes(varName)? 'Hey' : 'Default case')or just a single line of code:
alert(["afshin", "saeed", "larry",...].includes(varName)? 'Hey' : 'Default case')a little improvement from ErikE's answer
Comments
I can see there are lots of good answers here, but what happens if we need to check more than 10 cases? Here is my own approach:
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'));1 Comment
if (accessDenied.includes(varName)) return 'Access Denied!'; return 'Access Allowed.' is more than enough.The problem with the above approaches, is that you have to repeat the severalcases every time you call the function which has theswitch. A more robust solution is to have amap or adictionary.
Here is an example:
// 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') 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')}Comments
One of the possible solutions is:
const names = {afshin: 'afshin',saeed: 'saeed',larry: 'larry'};switch (varName) { case names[varName]: { alert('Hey'); break; } default: { alert('Default case'); break; }}Cleaner way to handle that
if (["triangle", "circle", "rectangle"].indexOf(base.type) > -1){ //Do something}else if (["areaMap", "irregular", "oval"].indexOf(base.type) > -1){ //Do another thing}You can do that for multiple values with the same result
Comments
If your case conditions are complex, many case value matches, or dynamic value match required, then it may be best to move that case matching logic to handler child functions.
In your case, if say you had thousands of usernames to match against for a security permissions check for example, this method is cleaner option, more extensible, exposing the high level multi-way branch logic without getting swamped in a long list of case statements.
switch (varName) { case checkPatternAdministrator(varName): alert('Hey'); break; case checkPatternUserTypeA(varName): alert('Hey2'); break; case checkPatternUserTypeB(varName): alert('Hey3'); break; default: alert('Default case'); break; } function checkPatternAdministrator(varName) { // Logic to check Names against list, account permissions etc. // return the varName if a match is found, or blank string if not var matchedAdministratorName = varName; return matchedAdministratorName; }1 Comment
Another way of doing multiple cases in aswitch statement, when inside a function:
function name(varName){ switch (varName) { case 'afshin': case 'saeed': case 'larry': return 'Hey'; default: return 'Default case'; }}console.log(name('afshin')); // HeyComments
Just change theswitch condition approach:
switch (true) { case (function(){ return true; })(): alert('true'); break; case (function(){ return false; })(): alert('false'); break; default: alert('default');}6 Comments
(expression) in parenthesis, and the return value must be the input. See my answerswitch(true) { case (var1 === 0 && var2 === true): {} }You could write it like this:
switch (varName){ case "afshin": case "saeed": case "larry": alert('Hey'); break; default: alert('Default case'); break;}1 Comment
The switch statement is used to select one of many code blocks to execute based on a condition
- the value in the switch expression is compared to the different values provided
- if there is a match the code block related to it will be executed
- if there is no match the default block is executed
syntax:
switch(expression) { case x: // code block break; case y: // code block break; default: // code block}NOTE:It must be noted that if the break statement is omitted then the next block will be executed as well even if they does not match with switch expression. So don't forget to add the break statement at the end of each code block if you don't want to get the specified behaviour
A practical example:the following code returns the current day of the week in strings based on an integer (provided by 'new Date().getDay()')
switch (new Date().getDay()) { case 0: day = "Sunday"; break; case 1: day = "Monday"; break; case 2: day = "Tuesday"; break; case 3: day = "Wednesday"; break; case 4: day = "Thursday"; break; case 5: day = "Friday"; break; case 6: day = "Saturday";}the code samples were taken fromW3Schools
1 Comment
<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></div> <center> <h2> Switch Case Example </h2> <p>Enter a Number Between 1 to 7</p> <input type="text" /> <button>Check</button><br /> <div><b></b></div> </center> </center></body>4 Comments
switch statement is supposed to work. It’s justcase "1":, notcase (num = "1"):.document.getElementById("result").innerHTML = ....outside the switch and add the day value result at the end?num but it still works because theswitch has already been evaluated and the assignment yields the value. This is programming by mutation/machine learning at its finest.For me this is the simplest way:
switch (["afshin","saeed","larry"].includes(varName) ? 1 : 2) { case 1: alert('Hey'); break; default: alert('Default case'); break;}3 Comments
if statement.Explore related questions
See similar questions with these tags.
































