Mackija
Mackija

Reputation: 317

Javascript switch case that runs code when any case is true?

I have a standard switch case block:

switch(variable) {
    case "option1":
        alert("Option 1");
        break;
    case "option2":
        alert("Option 2");
        break;
}

And I would like to run this code:

alert("Any Option");

Is there a simple way to run this code when either of the cases match, without adding the code to every case, and without rechecking "variable" (i.e. not using an if statement after the switch)?

Upvotes: 1

Views: 4122

Answers (5)

mhodges
mhodges

Reputation: 11116

There are a bunch of really hacky ways to do what you are suggesting (named do loops with break/continue, recursive functions with switch statements, etc.) but the cleanest would be to use a function, like so:

var variable = "option1";

function checkValue (val) {
    switch (variable) {
        case "option1":
            alert("Option 1");
            return true;
        case "option2":
            alert("Option 2");
            return true;
        default: 
            return false;
    }
}

if (checkValue(variable)) {
    // run common code
    alert("Any option");
}

Upvotes: 3

wiesion
wiesion

Reputation: 2455

I don't think i would ever use the pattern you described, nonetheless something like this could suit your needs.

/**
 * Use this method to simulate a "finally" statement in a
 * method that resembles a switch
 *
 * @param {*} value - The value to compare
 * @param {Array<*, boolean, function>} options - The collection of switch statements
 *   First value is the value to compare against the original value
 *   Second value specifies if this statement should behave like a break at its end
 *   Third value is the action to take when the value matches
 * @param {function} finallyFn - The method which is run if any statement was executed
 */
function switchWithFinally(value, options, finallyFn) {
    var matched = false,
        breakSwitch = true;
    for(var i = 0; i < options.length; i++) {
        if(!breakSwitch || value === options[i][0]) {
            options[i][2]();
            matched = true;
            breakSwitch = options[i][1];
        }
    }
    if(matched) finallyFn();
}

/**
 * Example call, should return
 *   Option 2
 *   Option 3
 *   Any option
 */
switchWithFinally(
    'option2',
    [
        ['option1', true, function() {
            console.log('Option 1');
        }],
        ['option2', false, function() {
            console.log('Option 2');
        }],
        ['option3', true, function() {
            console.log('Option 3');
        }]
    ],
    function() {
        console.log('Any option');
    }
);

Upvotes: 1

Cheloide
Cheloide

Reputation: 805

Why not making a function called by both cases?

switch(variable) {
case "option1":
    dualAlert("Option 1");
    break;
case "option2":
    dualAlert("Option 2");
    break;
}

function dualAlert(text){
    alert(text);
    alert('Common Alert');
}

Upvotes: 1

joews
joews

Reputation: 30330

Not directly with a switch statement. See The Switch Statement, ECMAScript 2016 standard.

In particular:

The language spec does not contain the feature that you are looking for.

Upvotes: 1

le_m
le_m

Reputation: 20238

A labeled block allows you to break out of it at any time. If you break in the default case, you can run some code following the switch statement when either of the cases match and without rechecking the variable, as requested:

let variable = prompt("option1 or option2?");

select: {
  switch(variable) {
    case "option1":
        alert("Option 1");
        break;
    case "option2":
        alert("Option 2");
        break;
    default:
        break select;
  }
  alert("Both Options");
}

However, I don't recommend this! Labels make the code execution path less clear. Above code is not readable. Rechecking the variable is a better approach.

Upvotes: 1

Related Questions