Switch statement with numeric values - javascript

Trying simple switch with random number.
It does not seem to work. Always getting to default case.
var x = 0;
x = (Math.random() * 10 + 1);
switch(x) {
case x >= 5:
console.log("the number is bigger than 5");
break;
case x <= 5:
console.log("the number is smaller than 5");
break;
default:
console.log("strange number");
}
console.log(x);
The output is always similar to that:
strange number
5.922413225153608

That's just not how switch statements work in JavaScript,1 what you're looking for there is an if/else if/else series instead:
if (x >= 5) {
console.log("the number is bigger than 5");
} else if (x <= 5) {
console.log("the number is smaller than 5");
} else {
console.log("strange number");
}
Two notes, though:
Your first and second cases both include 5; the first will win.
The only value for x that will reach the final else is NaN (or something that converts to NaN when converted to number), because NaN >= 5 and NaN <= 5 are both false.
In a comment you've said:
Thanks, the point is to practice switch.
If so, you'll either have to do the thing below (which probably isn't what your instructor wanted), or limit the range of values, because the cases of a switch are tested for exact match.
For instance, if you changed your code only allow integers, you could use cases with fall-through:
var x = 0;
x = Math.floor(Math.random() * 10 + 1); // Note change: Only integers
switch(x) {
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
console.log("the number is bigger than 5");
break;
case 1:
case 2:
case 3:
case 4:
console.log("the number is smaller than 5");
break;
default:
console.log("strange number");
}
console.log(x);
That makes use of the fact that cases fall through to the following case when you don't use break.
But you can't do that with your original x, because there are just too many floating-point values in the range 1 <= x < 11 to list.
JavaScript's switch does have a feature that makes it possible to use switch here, but an if/else if/else is almost certainly a better choice. Purely for completeness:
// PROBABLY NOT A GOOD IDEA
switch (true) {
case x >= 5:
console.log("the number is bigger than 5");
break;
case x <= 5:
console.log("the number is smaller than 5");
break;
default:
console.log("strange number");
break;
}
That works because unlike many languages, JavaScript's switch cases are allowed to be expressions, and they're tested in the order in which they appear in the switch (other than default, of course), with the first matching case being used.
But again, probably not great to use in the real world except in very, very limited situations.

Between case and : you have to have a value.
x >= 5 and x <= 5 are going to give you true or false, which x will then be compared to. Since x will always be a number, it will never be true or false so you will always hit the default.
Use if/else if/else instead.

You can't do in thatway. You have to do
switch(true) {
case x >= 5:
console.log("the number is bigger than 5");
break;
case x <= 5:
console.log("the number is smaller than 5");
break;
default:
console.log("strange number");
}

While switch is using strict comparison and you have already in the case clause already a comparison, you could change your switch statement to
switch(true) {
and use the rest, you have.

Related

Program to check if number is odd or even using switch statement

I'm trying to write a program that uses a switch statement to check if a number is odd or even.
For some reason I'm not getting anything printed to the console. When I add a default case though, it automatically prints the default (console.log("Invalid input"). Can someone explain why this approach doesn't work?
var enteredNumber = 40;
var enteredNumber_div_by2 = enteredNumber/2;
switch(enteredNumber_div_by2) {
case Number.isInteger(enteredNumber_div_by2) === true:
console.log(enteredNumber.toString() + " is an even number.");
break;
case Number.isInteger(enteredNumber_div_by2) === false:
console.log(enteredNumber.toString() + " is an odd number.");
break;
case enteredNumber_div_by2.isNaN() === true:
console.log("Invalid input");
break;
default:
console.log("Invalid input");
}
edit: In case anyone else is trying to understand switch statements like I am, I revised my code based on Rocket's answer and it works now. I realize this is not the best way to check if a number is odd or even but I'm doing this solely to understand switch statements. Also, I realized my code doesn't really check if the input is a number so even if you input "hi" it will return "hi is an odd number". Here is my revised switch statement:
switch(Number.isInteger(enteredNumber_div_by2) === true) {
case true:
console.log(enteredNumber.toString() + " is an even number.");
break;
case false:
console.log(enteredNumber.toString() + " is an odd number.");
break;
default:
console.log("Invalid input")
edit 2: Nina's answer works the best:
switch (enteredNumber % 2) {
case 0:
console.log(enteredNumber.toString() + " is an even number.");
break;
case 1:
console.log(enteredNumber.toString() + " is an odd number.");
break;
default:
console.log("Invalid input")
}
You could take the remainder and check the value of it.
The switch statement takes two values and uses a strict comparison, like ===.
If you use inside case a boolean value, you need to use in the switch part another corresounding boolean value.
Even if Javascript offers to use dynamic content in both parts, some people tend to accept only constant values to compare instead of dynamic values.
var enteredNumber = 40;
switch (enteredNumber % 2) {
case 0:
console.log(enteredNumber + " is an even number.");
break;
case 1:
console.log(enteredNumber + " is an odd number.");
break;
default:
console.log("Invalid input");
}
This is is not how switch statements work. A switch is used to compare a variable to a list of values. Such as:
let a = 'a';
switch(a) {
case 'a':
break;
case 'b':
break;
}
If you want to check Number.isInteger(enteredNumber_div_by2), then just use an if/else:
if (Number.isInteger(enteredNumber_div_by2)) {
console.log(enteredNumber.toString() + " is an even number.");
}
else {
console.log(enteredNumber.toString() + " is an odd number.");
}
If for whatever reason you really wanted to use a switch here, you'd have to do:
switch (Number.isInteger(enteredNumber_div_by2)) {
case true:
console.log(enteredNumber.toString() + " is an even number.");
break;
case false:
console.log(enteredNumber.toString() + " is an odd number.");
break;
}

switch statement to compare values greater or less than a number

I want to use the switch statement in some simple code i'm writing.
I'm trying to compare the variable in the parenthesis with values either < 13 or >= 13.
Is this possible using Switch?
var age = prompt("Enter you age");
switch (age) {
case <13:
alert("You must be 13 or older to play");
break;
case >=13:
alert("You are old enough to play");
break;
}
Directly it's not possible but indirectly you can do this
Try like this
switch (true) {
case (age < 13):
alert("You must be 13 or older to play");
break;
case (age >= 13):
alert("You are old enough to play");
break;
}
Here switch will always try to find true value. the case which will return first true it'll switch to that.
Suppose if age is less then 13 that's means that case will have true then it'll switch to that case.
Instead of switch you can easily to the same thing if else right?
if(age<13)
alert("You must be 13 or older to play");
else
alert("You are old enough to play");
This worked in my case:
var enteredAge = prompt("Enter your age");
let ageMoreThan13 = parseInt(enteredAge) >= 13;
let ageLessThan13 = parseInt(enteredAge) < 13;
switch (ageMoreThan13 || ageLessThan13) {
case ageLessThan13:
alert("You must be 13 or older to play");
break;
case ageMoreThan13:
alert("You are old enough to play");
break;
}
Instead of switch use nested if else like this:
if (x > 10) {
disp ('x is greater than 10')
}
else if (x < 10){
disp ('x is less than 10')
}
else
{
disp ('error')
}
You may use a conditional (ternary) operator instead. It takes a condition followed by a question mark (?), then an expression to execute if the condition is true and another if it is false.
This operator is frequently used as a shortcut for the if statement.
age >= 13 ? "You are old enough to play" : "You must be 13 or older to play";
It might be a bit silly to do this with a switch-case, but I added an answer where using switch-case, just for completeness.
var age = prompt("Enter you age");
switch (age) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
alert("You must be 13 or older to play");
break;
default:
alert("You are old enough to play");
break;
}

Inequalities inside a switch statement [duplicate]

This question already has answers here:
JavaScript conditional switch statement
(5 answers)
Closed 7 years ago.
I just started learning about the switch command in JavaScript, and was wondering if the cases could be constructed so as to include inequalities (<, >, <= and >=), instead of equality (==). Also, can one control whether it is a strict equality (===) or not? The following code does not even bring up a prompt, so I'm not sure if I've coded correctly:
var a = prompt("Please input a number.");
switch (a) {
case { < 1 }:
alert("less than 1");
break;
case { < 2 }:
alert("less than 2");
break;
case { < 3 }:
alert("less than 3");
break;
default:
alert("greater than or equal to 3");
}
It is actually possible, if you do it like this. The case whose expression evaluates to true is executed.
var a = +prompt("Please input a number.");
switch (true) {
case (a<1): alert("less than 1");
break;
case (a<2): alert("less than 2");
break;
case (a<3): alert("less than 3");
break;
default: alert("greater than or equal to 3");
}
Note: Personally I feel you should use if-else for this purpose.

How can I use ranges in a switch case statement using JavaScript?

How can I use ranges in a switch case statement using JavaScript? So, instead of writing code for each and every single possibility, I'd like to group them in ranges, For example:
switch(myInterval){
case 0-2:
//doStuffWithFirstRange();
break;
case 3-6:
//doStuffWithSecondRange();
break;
case 6-7:
//doStuffWithThirdRange();
break;
default:
//doStuffWithAllOthers();
}
You have at least four options:
1. List each case
As shown by LightStyle, you can list each case explicitly:
switch(myInterval){
case 0:
case 1:
case 2:
doStuffWithFirstRange();
break;
case 3:
case 4:
case 5:
doStuffWithSecondRange();
break;
case 6:
case 7:
doStuffWithThirdRange();
break;
default:
doStuffWithAllOthers();
}
2. Use if / else if / else
If the ranges are large, that gets unwieldy, so you'd want to do ranges. Note that with if...else if...else if, you don't get to the later ones if an earlier one matches, so you only have to specify the upper bound each time. I'll include the lower bound in /*...*/ for clarity, but normally you would leave it off to avoid introducing a maintenance issue (if you include both boundaries, it's easy to change one and forget to change the other):
if (myInterval < 0) {
// I'm guessing this is an error
}
else if (/* myInterval >= 0 && */ myInterval <= 2){
doStuffWithFirstRange();
}
else if (/* myInterval >= 3 && */ myInterval <= 5) {
doStuffWithSecondRange();
}
else if (/* myInterval >= 6 && */ myInterval <= 7) {
doStuffWithThirdRange();
}
else {
doStuffWithAllOthers();
}
3. Use case with expressions:
JavaScript is unusual in that you can use expressions in the case statement, so we can write the if...else if...else if sequence above as a switch statement:
switch (true){
case myInterval < 0:
// I'm guessing this is an error
break;
case /* myInterval >= 0 && */ myInterval <= 2:
doStuffWithFirstRange();
break;
case /* myInterval >= 3 && */ myInterval <= 5:
doStuffWithSecondRange();
break;
case /* myInterval >= 6 && */ myInterval <= 7:
doStuffWithThirdRange();
break;
default:
doStuffWithAllOthers();
}
I'm not advocating that, but it is an option in JavaScript, and there are times it's useful. The case statements are checked in order against the value you give in the switch. (And again, lower bounds could be omitted in many cases because they would have matched earlier.) Even though the cases are processed in source-code order, the default can appear anywhere (not just at the end) and is only processed if either no cases matched or a case matched and fell through to the default (didn't have a break; it's rare you want to do that, but it happens).
4. Use a dispatch map
If your functions all take the same arguments (and that could be no arguments, or just the same ones), another approach is a dispatch map:
In some setup code:
var dispatcher = {
0: doStuffWithFirstRange,
1: doStuffWithFirstRange,
2: doStuffWithFirstRange,
3: doStuffWithSecondRange,
4: doStuffWithSecondRange,
5: doStuffWithSecondRange,
6: doStuffWithThirdRange,
7: doStuffWithThirdRange
};
Then instead of the switch:
(dispatcher[myInterval] || doStuffWithAllOthers)();
That works by looking up the function to call on the dispatcher map, defaulting to doStuffWithAllOthers if there's no entry for that specific myInterval value using the curiously-powerful || operator, and then calling it.
You can break that into two lines to make it a bit clearer:
var f = dispatcher[myInterval] || doStuffWithAllOthers;
f();
I've used an object for maximum flexibility. You could define dispatcher like this with your specific example:
var dispatcher = [
/* 0-2 */
doStuffWithFirstRange,
doStuffWithFirstRange,
doStuffWithFirstRange,
/* 3-5 */
doStuffWithSecondRange,
doStuffWithSecondRange,
doStuffWithSecondRange,
/* 6-7 */
doStuffWithThirdRange,
doStuffWithThirdRange
];
...but if the values aren't contiguous numbers, it's much clearer to use an object instead.
The ranges in this example are pretty small, but here's how one can handle larger ranges, per the JavaScript MDN Docs:
// The value we'll be evaluating:
let code = 100;
// Matches for any case where the expression === `true`:
switch (true) {
case code <= 64:
return "Your number is 64 or less!";
break;
case code >= 65 && code <= 90:
return "Your number is in the range of 65-90!";
break;
case code >= 97 && code <= 122:
return "Your number is in the range of 97-122!";
break;
case code >= 123:
return "Your number is 123 or greater!";
break;
default:
break;
}
I know that this style was already shown by T.J. Crowder via Use case with Expressions, but I just wanted to show another example of how to utilize this same method. I just did this and had thought maybe another example might help someone, as I was still a little confused after reading other replies.
Is this maybe what you need?
switch(myInterval){
case 0:
case 1:
case 2:
//doStuff();
break;
case 3:
case 4:
case 5:
case 6:
//doStuff();
break;
case 6:
case 7:
//doStuff();
break;
default:
//doStuff();
}
If you know the range is going to be very high(for example 0-100) you can also do this, which is surely easier, cleaner and simpler:
if (myInterval >= 0 && myInterval <= 20) {
//doStuff();
} else if (myInterval > 20 && myInterval <= 60) {
//doStuff();
} else if (myInterval > 60 && myInterval <= 70) {
//doStuff();
} else /* it is greater than 70 */ {
//doStuff();
}
If your ranges are the same and start from 0 you can do some math.
doStuffWithRange(Math.floor(myInterval/range));
For example, if you want RED, GREEN, and BLUE to the map like your example:
Range 0-2 maps to RED
Range 3-6 maps to GREEN
Range 7-8 maps to BLUE
You can write:
function colorInterval(n, max) {
var colors = ["RED", "GREEN", "BLUE"];
var range = max/colors.length
return colors[Math.floor(n/range)];
}
//You get 3 of RED, 3 of GREEN, 2 of BLUE
for (var i=0; i<8; i++) {
console.log(colorInterval(i, 8));
}
Note that the last range in the example is 2, not 3 and this still works as long as the previous ranges are the same.
To add a bit of diversity to the excellent answers already posted, especially as the intervals starts with 0, here is a solution with findIndex (Yeah ES6):
const range = [0, 2, 6, 7];
const randeIndex = range.findIndex(threshold => myInterval <= threshold);
switch (rangeIndex) {
case 1:
//doStuffWithFirstRange();
break;
case 2:
//doStuffWithSecondRange();
break;
case 3:
//doStuffWithThirdRange();
break;
default:
//doStuffWithAllOthers();
}
Because the range array is ordered, findIndex will match the first one. Depending on how you name your ranges, stating from 0 or 1, you may need to remove the first 0 in range.
Use case statement with defined string or value or use "if else if", in case range is higher
int levelNumber = YOUR_VALUE FROM
NSString* strMessage;
switch (levelNumber) {
case 1...10:
{
// Do something...
break;
}
case 11...20:
{
// Do something...
break;
}
case 21...30:
{
// Do something...
break;
}
case 31...40:
{
// Do something...
break;
}
default:
break;
}
Refer:
https://www.codingexplorer.com/loops-switch-statements-ranges-swift/

Can a mathematical operator be used in a switch expression?

I'm having a problem using a mathematical operator in a switch expression.
This is what my code currently looks like:
var x = 18;
var y = 82;
var result = x + y;
switch(result) {
case "200":
document.write("200!");
break;
case "500":
document.write("500!");
break;
case "100":
document.write("100! :)");
break;
default:
document.write("Something's not right..");
}
Explained: the variable "result" has a value of 100. I am trying to use that value with the switch operator, but it just isn't working.
I've also tried using the equation itself as the switch expression, but that doesn't work either.
P.S: I just started out with JavaScript. Bet I missed something obvious...
Change "100" to 100 and it works. switch must be using the semantics of === which means 'type and value are equal' vs ==, which will try to make the types similar and then compare.
EDIT -- here is a screenshot showing it working
You're comparing the number 100 to the string "100", that isn't the same. Try this:
var x = 18;
var y = 82;
var result = x + y;
switch(result) {
case 200:
document.write("200!");
break;
case 500:
document.write("500!");
break;
case 100:
document.write("100! :)");
break;
default:
document.write("Something's not right..");
}
You are using strings in your case statements. Take the quotes (") out and you should be fine.

Categories

Resources