Mam standardowy blok obudowy przełącznika:

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

I chciałbym uruchomić ten kod:

alert("Any Option");

Czy istnieje prosty sposób na uruchomienie tego kodu, gdy Mecz walizek, bez dodawania kodu do każdego przypadku, a bez Sprawdź "zmienną" (tj. Nie korzystając z instrukcji Jeśli po przełączniku)?

1
Mackija 23 czerwiec 2017, 22:33

5 odpowiedzi

Najlepsza odpowiedź

Istnieje kilka sposobów hacky , aby robić to, co sugerujesz (o imieniu l pętki z break / kontynuuj, funkcje rekurencyjne z wyciągami przełącznikowymi itp.) Ale najczystsze byłoby użycie funkcji, jak więc:

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");
}
3
mhodges 6 lipiec 2017, 15:41

Dlaczego nie dokonać funkcji wezwanych przez obu przypadków?

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

function dualAlert(text){
    alert(text);
    alert('Common Alert');
}
0
Cheloide 23 czerwiec 2017, 20:04

Nie sądzę, żebym kiedykolwiek użyjesz opisanego wzoru, jednak coś takiego może odpowiadać Twoim potrzebom.

/**
 * 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');
    }
);
1
wiesion 23 czerwiec 2017, 20:41

Nie bezpośrednio z oświadczeniem switch. Patrz Oświadczenie przełącznika ECMAScript Standard 2016.

W szczególności:

Spec język nie zawiera funkcji, której szukasz.

1
joews 23 czerwiec 2017, 20:03

Znakowany blok pozwala na wyrwanie się w dowolnym momencie. Jeśli włamujesz się w przypadku default, możesz uruchomić jakiś kod zgodnie z instrukcją switch, gdy każdy z przypadków pasuje i bez ponownego załadowania zmiennej, zgodnie z żądaniem:

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");
}

Jednak nie polecam tego! Etykiety sprawiają, że ścieżka wykonania kodu jest mniej wyraźna. Powyżej kodu nie jest czytelny. Sprawdź zmienną jest lepsze podejście.

1
le_m 23 czerwiec 2017, 19:56