Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

(How) Can i use 'or' in a switch statement?

Is the following code right:

var user = prompt("Is programming awesome?").toUpperCase();
switch (user) {
    case 'HELL YEAH' || 'YES' || 'YEAH' || 'YEP' || 'YEA':
        console.log("That's what I'd expected!");
    break;
    case 'KINDA'||'CANT SAY':
        console.log("Oh, you'd like it when you'll be a pro!");
    break;
    case 'HELL NO'||'NO'||'NAH'||'NOPE'||'NA':
        console.log("You can't say that!");
    break;
    default:
        console.log("Wacha tryna say mate?");
    break;
}

I tried it. But it didn't work as I wanted it to. It worked well if the input was 'hell no' or 'hell yeah', but all the later strings were just ignored!

like image 425
Perceptioner Avatar asked Dec 19 '22 03:12

Perceptioner


2 Answers

I would approach this using a dictionary (object) containing your answers which you can then check with a function in the switch statement. It's a lot neater than having multiple case checks:

var user = prompt("Is programming awesome?").toUpperCase(); // 'HELL YEAH';

// 'dictionary' is just a JS object that has key/value pairs
// In this instance we have keys that map the case checks you were
// making and each has a corresponding array for its value, filled with
// the OR checks you wanted to make.
// We pass 'dict' in as the second parameter when we call checkAnswer
var dict = {
    yes: ['HELL YEAH', 'YES', 'YEAH', 'YEP', 'YEA'],
    maybe: ['KINDA', 'CANT SAY'],
    no: ['HELL NO', 'NO', 'NAH', 'NOPE', 'NA']
};

// checkAnswer returns 'yes' for the user prompt 'HELL YEAH'
// It loops over the 'dict' object and if it finds an instance of
// your user input in one of the arrays it returns the key
// in this instance 'yes' for 'HELL YEAH' (indexOf returns 0)
// otherwise it returns false (for your 'default' case)
function checkAnswer(user, dict) {
    for (var p in dict) {
        if (dict[p].indexOf(user) > -1) return p;
    }
    return false;
}

// All we do is use checkAnswer to return the key where
// the user input is found in one of the dictionary arrays.
// That will always be a single string which is what switch expects
switch (checkAnswer(user, dict)) {
    case 'yes':
        console.log("That's what I'd expected!");
        break;
    case 'maybe':
        console.log("Oh, you'd like it when you'll be a pro!");
        break;
    case 'no':
        console.log("You can't say that!");
        break;
    default:
        console.log("Wacha tryna say mate?");
        break;
}

DEMO

like image 78
Andy Avatar answered Dec 21 '22 16:12

Andy


I guess you have to do :

var user = prompt("Is programming awesome?").toUpperCase();
  switch (user) {
    case 'HELL YEAH':
    case 'YES':
    case 'YEAH':
    case 'YEP':
    case 'YEA':
      console.log("That's what I'd expected!");
      break;
   case 'KINDA':
      ...
}

And so on...

like image 33
Michel Antoine Avatar answered Dec 21 '22 15:12

Michel Antoine