Question Changer l'instruction plusieurs cas en JavaScript


J'ai besoin de plusieurs cas dans l'instruction switch en JavaScript, quelque chose comme:

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

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

Comment puis je faire ça? S'il n'y a aucun moyen de faire quelque chose comme ça en JavaScript, je veux savoir une solution alternative qui suit Concept DRY.


506
2017-11-03 09:43


origine


Réponses:


Utilisez la fonction d'atténuation de la switch déclaration. Un cas correspondant sera exécuté jusqu'à ce qu'un break (ou la fin de la switch déclaration) est trouvé, donc vous pouvez l'écrire comme:

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

   default: 
       alert('Default case');
}

1014
2017-11-03 09:44



Cela fonctionne en JavaScript ordinaire

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

À votre santé.


52
2018-01-17 02:15



Voici une approche différente évitant le switch déclaration tout à fait:

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

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

43
2017-11-03 09:55



Dans Js pour assigner plusieurs cas dans le commutateur Nous devons définir different case without break comme donné ci-dessous:

   <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>

S'il vous plaît voir l'exemple cliquez sur lien


14
2017-11-03 09:53



Si vous utilisez ES6, vous pouvez le faire:

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

Ou pour les versions antérieures de JavaScript, vous pouvez le faire:

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

Notez que cela ne fonctionnera pas dans les anciens navigateurs IE, mais vous pourriez facilement les corriger. Voir la question déterminer si la chaîne est dans la liste en javascript pour plus d'informations.


10
2017-07-30 20:11



vous pouvez utiliser le 'dans'opérateur ...
repose sur l'invocation objet / hachage ...
donc c'est aussi rapide que javascript peut être ...

// 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]()

Enjoy, ZEE


5
2017-09-06 12:51



En ajoutant et en clarifiant la réponse de Stefano, vous pouvez utiliser des expressions pour définir de manière dynamique les valeurs des conditions dans le commutateur, par exemple:

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

Donc, dans votre problème, vous pourriez faire quelque chose comme:

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

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

bien que n'étant pas tellement DRY ..


4
2017-12-06 15:10



Dans le noeud, il semble que vous êtes autorisé à le faire:

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

Cela rend le code beaucoup plus compact dans certains cas.


3
2017-09-01 09:12



switch (myVariable)
{
  case "A":
  case "B":
  case "C": 
    // Do something
    break;
  case "D":
  case "E":
    // Do something else
    break;
  default: 
    // Default case
    break;
}

Dans cet exemple, si la valeur de myVariable est A, B ou C, elle exécutera le code sous le cas "C" :.


2
2018-01-10 07:21



Ça dépend.  Commutateur évalue une fois et une seule fois. Lors d'une correspondance, toutes les déclarations de cas subséquentes jusqu'à la «rupture» se déclenchent, quel que soit le cas.

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>


1
2018-03-10 16:07



Une autre façon de faire plusieurs cas dans une instruction switch, à l'intérieur d'une fonction

 function name(varName){
      switch (varName) {
         case 'afshin':
         case 'saeed':
         case 'larry':
           return 'Hey';
         default:
           return 'Default case';
       }
    }
            
    console.log(name('afshin')); //Hey


0
2018-01-09 22:37