wake-up-neo.net

Mehrere Fälle in JavaScript wechseln

Ich brauche mehrere Fälle in der switch-Anweisung in JavaScript. Etwas wie:

switch (varName)
{
   case "afshin", "saeed", "larry": 
       alert('Hey');
       break;

   default: 
       alert('Default case');
       break;
}

Wie kann ich das machen? Wenn es in JavaScript keine Möglichkeit gibt, so etwas zu tun, möchte ich eine alternative Lösung kennen, die ebenfalls dem DRY Konzept folgt.

575

Verwenden Sie die Fall-Through-Funktion der switch-Anweisung. Ein übereinstimmender Fall wird ausgeführt, bis eine break (oder das Ende der switch-Anweisung) gefunden wird.

switch (varName)
{
   case "afshin":
   case "saeed":
   case "larry": 
       alert('Hey');
       break;

   default: 
       alert('Default case');
}
1164
kennytm

Dies funktioniert in normalem JavaScript

function theTest(val) {
  var answer = "";
  switch( val ) {
    case 1: case 2: case 3:
      answer = "Low";
      break;
    case 4: case 5: case 6:
      answer = "Mid";
      break;
    case 7: case 8: case 9:
      answer = "High";
      break;
    default:
      answer = "Massive or Tiny?";
  } 
  return answer;  
  }

  theTest(9);

Prost.

66
Rob Welan

Hier ist ein anderer Ansatz, der die switch-Anweisung insgesamt vermeidet:

var cases = {
  afshin: function() { alert('hey'); },
  _default: function() { alert('default'); }
};
cases.larry = cases.saeed = cases.afshin;

cases[ varName ] ? cases[ varName ]() : cases._default();
44
elclanrs

In Js zum Zuweisen mehrerer Fälle in switch müssen wir different case without break wie folgt definieren:

   <script type="text/javascript">
      function checkHere(varName){
        switch (varName)
           {
           case "saeed":
           case "larry":
           case "afshin":
                alert('Hey');
                break;
          case "ss":
             alert('ss');
             break;
         default:
             alert('Default case');
             break;
       }
      }
     </script>

Bitte siehe Beispiel auf link

15
Er. Anurag Jain

Wenn Sie ES6 verwenden, können Sie Folgendes tun:

if (['afshin', 'saeed', 'larry'].includes(varName)) {
   alert('Hey');
} else {
   alert('Default case');
}

Bei früheren JavaScript-Versionen können Sie Folgendes tun:

if (['afshin', 'saeed', 'larry'].indexOf(varName) !== -1) {
   alert('Hey');
} else {
   alert('Default case');
}

Beachten Sie, dass dies in älteren IE -Browsern nicht funktioniert, aber Sie könnten die Probleme ziemlich leicht korrigieren. Weitere Informationen finden Sie in der Frage Stellen Sie fest, ob der String in der Liste in JavaScript enthalten ist.

10
ErikE

Durch Hinzufügen und Verdeutlichen der Antwort von Stefano können Sie Ausdrücke verwenden, um die Werte für die Bedingungen in der Umschaltung zu definieren, z. B .:

var i = 3
switch (i) {
    case ((i>=0 && i<=5)?i:-1): console.log('0-5'); break;
    case 6: console.log('6');
}

In Ihrem Problem könnten Sie also Folgendes tun:

var varName = "afshin"
switch (varName) {
    case (["afshin", "saeed", "larry"].indexOf(varName)+1 && varName):
      console.log("hey");
      break;

    default:
      console.log('Default case');
}

obwohl es nicht so viel trocken ist ..

5
Z. Khullah

sie können den Operator ' in ' verwenden ... 
verlässt sich auf den Aufruf von object/hash ... 
so schnell wie Javascript sein kann ... 

// assuming you have defined functions f(), g(a) and h(a,b) 
// somewhere in your code
// you can define them inside the object but... 
// the code becomes hard to read, I prefer this way

o = { f1:f, f2:g, f3:h };

// if you use "STATIC" code can do:
o['f3']( p1, p2 )

// if your code is someway "DYNAMIC", to prevent false invocations
// m brings the function/method to be invoked (f1, f2, f3)
// and you can rely on arguments[] to solve any parameter problems
if ( m in o ) o[m]()

Viel Spaß, ZEE

5
ZEE

Im Knoten sieht es so aus, als ob Sie dazu berechtigt sind:

data = "10";
switch(data){
case "1": case "2": case "3": //put multiple cases on the same line to save vertical space.
   console.log("small"); break;
case "10": case "11": case "12":
   console.log("large"); break;
default:
   console.log("strange");
   break;
}

Dies macht in manchen Fällen den Code wesentlich kompakter.

3
Automatico

Es hängt davon ab, ob.Switch wertet nur einmal aus. Bei einem Spiel werden alle nachfolgenden Aussagen bis zum 'Break' ausgelöst, egal was der Fall sagt.

var onlyMen = true;
var onlyWomen = false;
var onlyAdults = false;
 
 (function(){
   switch (true){
     case onlyMen:
       console.log ('onlymen');
     case onlyWomen:
       console.log ('onlyWomen');
     case onlyAdults:
       console.log ('onlyAdults');
       break;
     default:
       console.log('default');
   }
})(); // returns onlymen onlywomen onlyadults
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

3
Ron Royston

Ich kann sehen, dass es hier viele gute Antworten gibt, aber was passiert, wenn wir mehr als 10 Fälle prüfen müssen? Hier ist mein eigener Ansatz:

 function isAccessible(varName){
     let accessDenied = ['Liam','Noah','William','James','Logan','Benjamin',
                        'Mason','Elijah','Oliver','Jacob','Daniel','Lucas'];
      switch (varName) {
         case (accessDenied.includes(varName)?varName:null): 
             return 'Access Denied!';
         default:
           return 'Access Allowed.';
       }
    }

    console.log(isAccessible('Liam'));
switch (myVariable)
{
  case "A":
  case "B":
  case "C": 
    // Do something
    break;
  case "D":
  case "E":
    // Do something else
    break;
  default: 
    // Default case
    break;
}

Wenn in diesem Beispiel der Wert von myVariable A, B oder C ist, wird der Code im Fall "C": ausgeführt.

2
Mr. HK

Ich benutze so:

switch (true){
     case /Pressure/.test(sensor):{
        console.log('Its pressure!');
        break;
     }
     case /Temperature/.test(sensor):{
        console.log('Its temperature!');
        break;
     }
}
1
Sergey Volkov

Eine der möglichen Lösungen ist:

const names = {
afshin: 'afshin',
saeed: 'saeed',
larry: 'larry'
};

switch (varName) {
   case names[varName]: {
       alert('Hey');
       break;
   }

   default: {
       alert('Default case');
       break;
   }
}
0
Jackkobec

Du kannst das:

alert([
  "afshin", 
  "saeed", 
  "larry",
  "sasha",
  "boby",
  "jhon",
  "anna",
  // ...
].includes(varName)? 'Hey' : 'Default case')

oder nur eine einzige Codezeile:

alert(["afshin", "saeed", "larry",...].includes(varName)? 'Hey' : 'Default case')

eine kleine Verbesserung von ErikEs Antwort

0
Dedy Abdillah

Das Problem bei den obigen Ansätzen ist, dass Sie die verschiedenen cases jedes Mal wiederholen müssen, wenn Sie die Funktion aufrufen, die die switch enthält. Eine robustere Lösung ist ein map oder ein dictionary .

Hier ein Beispiel

// the Map, divided by concepts
var dictionary = {
  timePeriod: {
    'month': [1, 'monthly', 'mensal', 'mês'],
    'twoMonths': [2, 'two months', '2 motnhs', 'bimestral', 'bimestre'],
    'trimester': [3, 'trimesterly', 'quarterly', 'trimestral'],
    'semester': [4, 'semesterly', 'semestral', 'halfyearly'],
    'year': [5, 'yearly', 'anual', 'ano']
  },
  distance: {
    'km': [1, 'kms', 'kilometre', 'kilometers', 'kilometres'],
    'mile': [2, 'mi', 'miles'],
    'nordicMile': [3, 'nordic mile', 'mil(10km)', 'scandinavian mile']
  },
  fuelAmount: {
    'ltr': [1, 'l', 'litre', 'Litre', 'liter', 'Liter'],
    'gal(imp)': [2, 'imp gallon', 'imperial gal', 'gal(UK)'],
    'gal(US)': [3, 'US gallon', 'US gal'],
    'kWh': [4, 'KWH']
  }
};

//this function maps every input to a certain defined value
function mapUnit (concept, value) {
  for (var key in dictionary[concept]) {
    if (key === value || 
      dictionary[concept][key].indexOf(value) !== -1) {
      return key
    }
  }
  throw Error('Uknown "'+value+'" for "'+concept+'"')
}

//you would use it simply like this
mapUnit("fuelAmount", "ltr") // => ltr
mapUnit("fuelAmount", "US gal") // => gal(US)
mapUnit("fuelAmount", 3) // => gal(US)
mapUnit("distance", "kilometre") // => km
  
//now you can use the switch statement safely without the need 
//to repeat the combinations every time you call the switch
var foo = 'monthly'
switch (mapUnit ('timePeriod', foo)) {
  case 'month': 
    console.log('month')
    break
  case 'twoMonths': 
    console.log('twoMonths')
    break
  case 'trimester': 
    console.log('trimester')
    break
  case 'semester': 
    console.log('semester')
    break
  case 'year': 
    console.log('year')
    break
  default:
    throw Error('error')
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>