webentwicklung-frage-antwort-db.com.de

Wie kann ich in einer switch case-Anweisung Bereiche mit JavaScript verwenden?

Wie kann ich in einer switch case-Anweisung Bereiche mit JavaScript verwenden? Anstatt Code für jede einzelne Möglichkeit zu schreiben, möchte ich sie in Bereichen gruppieren. Zum Beispiel:

switch(myInterval){
   case 0-2:
      //doStuffWithFirstRange();
      break;

   case 3-6:
      //doStuffWithSecondRange();
      break;

   case 6-7:
      //doStuffWithThirdRange();
      break;

   default:
      //doStuffWithAllOthers();
}
28
Lave Loos

Sie haben mindestens vier Möglichkeiten:

1. Listen Sie jedes case auf

Wie angezeigt durch LightStyle , können Sie jeden Fall explizit auflisten:

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. Verwenden Sie ifelse if/else

Wenn die Bereiche groß sind, wird dies unhandlich, so dass Sie Bereiche ausführen möchten. Beachten Sie, dass Sie mit if...else if...else if nicht zu den späteren gelangen, wenn eine frühere übereinstimmt. Sie müssen also nur jedes Mal die obere Grenze angeben. Die untere Schranke füge ich aus Gründen der Übersichtlichkeit in /*...*/ ein. Normalerweise lassen Sie dies jedoch aus, um ein Wartungsproblem zu vermeiden (wenn Sie beide Grenzen einschließen, können Sie leicht eine ändern und die andere vergessen).

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. Verwenden Sie case mit Ausdrücken:

JavaScript ist insofern ungewöhnlich, als Sie in der case-Anweisung Ausdrücke verwenden können, sodass wir die if...else if...else if-Sequenz oben als switch-Anweisung schreiben können:

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

Ich befürworte das nicht, aber ist eine Option in JavaScript, und manchmal ist es nützlich. Die case-Anweisungen werden _/in der Reihenfolge gegen den Wert geprüft, den Sie in switch eingeben. (Auch hier könnten untere Schranken in vielen Fällen weggelassen werden, da sie früher zusammenpassen würden.) Obwohl die cases in der Reihenfolge des Quellcodes verarbeitet werden, kann die default überall (nicht nur am Ende) erscheinen. und wird nur verarbeitet, wenn entweder keine cases gefunden wurde oder eine case übereinstimmt und auf den Standardwert zurückgreift (hatte keine break; dies ist selten der Fall, dies ist jedoch der Fall).

4. Verwenden Sie eine Versandkarte

Wenn Ihre Funktionen alle dieselben Argumente annehmen (und dies könnten keine oder genau dieselben Argumente sein), ist ein anderer Ansatz eine Dispatch-Map:

In einigen Setup-Codes:

var dispatcher = {
    0: doStuffWithFirstRange,
    1: doStuffWithFirstRange,
    2: doStuffWithFirstRange,

    3: doStuffWithSecondRange,
    4: doStuffWithSecondRange,
    5: doStuffWithSecondRange,

    6: doStuffWithThirdRange,
    7: doStuffWithThirdRange
};

Dann statt des Schalters:

(dispatcher[myInterval] || doStuffWithAllOthers)();

Das funktioniert, indem die Funktion zum Aufrufen der dispatcher-Map nachgeschlagen wird. Standardmäßig wird doStuffWithAllOthers verwendet, wenn für diesen bestimmten myInterval-Wert kein Eintrag mit dem dem merkwürdig mächtigen ||-Operator vorhanden ist, und dann aufgerufen.

Sie können das in zwei Zeilen aufteilen, um es etwas klarer zu machen:

var f = dispatcher[myInterval] || doStuffWithAllOthers;
f();

Ich habe ein Objekt für maximale Flexibilität verwendet. Sie könnten definieren dispatcher so mit Ihrem spezifischen Beispiel:

var dispatcher = [
    /* 0-2 */
    doStuffWithFirstRange,
    doStuffWithFirstRange,
    doStuffWithFirstRange,

    /* 3-5 */
    doStuffWithSecondRange,
    doStuffWithSecondRange,
    doStuffWithSecondRange,

    /* 6-7 */
    doStuffWithThirdRange,
    doStuffWithThirdRange
];

... aber wenn die Werte keine zusammenhängenden Zahlen sind, ist es viel klarer, stattdessen ein Objekt zu verwenden.

72
T.J. Crowder

Ist das vielleicht was Sie brauchen?

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

Wenn Sie wissen, dass der Bereich sehr hoch sein wird (beispielsweise 0-100), können Sie dies auch tun, was sicherlich einfacher, sauberer und einfacher ist:

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();
}
6

Die Bereiche in diesem Beispiel sind ziemlich klein, aber mit den JavaScript MDN Docs können Sie mit größeren Bereichen umgehen:

// 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;
}

Ich weiß, dass dieser Stil bereits von T.J. gezeigt wurde. Crowder über Verwenden Sie case mit Ausdrücken, aber ich wollte nur ein anderes Beispiel zeigen, wie diese Methode verwendet wird. Ich tat dies einfach und hatte gedacht, dass vielleicht ein anderes Beispiel jemandem helfen könnte, da ich immer noch etwas verwirrt war, nachdem ich andere Antworten gelesen hatte.

3
twknab

Wenn Ihre Bereiche gleich sind und bei 0 beginnen, können Sie einige Berechnungen durchführen. 

doStuffWithRange(Math.floor(myInterval/range));

Wenn Sie beispielsweise ROT, GRÜN und BLAU auf der Karte wie in Ihrem Beispiel haben möchten:

  • Der Bereich 0-2 wird ROT zugeordnet
  • Bereich 3-6 Karten zu GRÜN
  • Der Bereich 7-8 ist BLAU

Du kannst schreiben:

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

Beachten Sie, dass der letzte Bereich in diesem Beispiel 2 ist und nicht 3, und dies funktioniert immer noch, solange die vorherigen Bereiche gleich sind.

2
iamdimitar

Um den bereits geposteten hervorragenden Antworten ein wenig Abwechslung zu verleihen, zumal die Intervalle mit 0 beginnen, finden Sie hier eine Lösung mit 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();
}

Da das Array range bestellt ist, stimmt findIndex mit dem ersten überein. Je nachdem, wie Sie Ihre Bereiche mit 0 oder 1 benennen , müssen Sie möglicherweise die ersten 0 in range entfernen.

0
Al-un

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/

0