Вопрос по switch-statement, javascript – Переключить оператор несколько случаев в JavaScript

590

Мне нужно несколько случаев в выражении switch в JavaScript, что-то вроде:

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

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

Как я могу это сделать? Если там'Нет способа сделать что-то подобное в JavaScript, я хочу знать альтернативное решение, которое также следуетСУХАЯ концепция

Тому, кто проголосовал, чтобы закрыть этот вопрос. Ему более 5 лет, и он уже получил ответ - зачем закрытое голосование? surfmuggle
@surfmuggle, потому что этоНет необходимости добавлять больше ответов. Afshin Mehrabani
@AfshinMehrabani может быть это можно защитить, а не закрыть? evolutionxbox

Ваш Ответ

17   ответов
44

Вот'другой подход, избегаяswitch утверждение в целом:

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

cases[ varName ] ? cases[ varName ]() : cases._default();
Это ужасная функция. Как младший разработчик должен быстро взглянуть на это и понять это? Да, оператор switch занимает больше места, но его легче отлаживать и поддерживать. Karl Gjertsen
@michael. Это было опубликовано давным-давно по вопросу, связанному с MDN. КонечноУ тебя есть голоса. : - / wizzwizz4
Это ужасно, если единственная причина, по которой вы это делаете, заключается в том, что у вас есть боязнь менять высказывания. Я бы разозлился, если бы мне пришлось прочитать это, чтобы понять, что это то же самое, что и переключатель. ПОЦЕЛУЙ Martin Dawson
Неа,switch это антипаттерн в моей книге. Это совсем не сложно, наоборот, это общая альтернатива, и, очевидно, она лучше подходит для сопровождения и рефакторинга, поскольку теперь вы можете перемещать дела, потому что вы получили выражения, а не операторы. elclanrs
1183

Используйте функцию сбросаswitch заявление. Соответствующий случай будет работать доbreak (или конецswitch утверждение), так что вы можете написать его так:

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

   default: 
       alert('Default case');
}
@nafg: попробуйswitch(1), Метка здесь - просто выражение запятой. kennytm
@Seiyira по определению, нет следующего дела после последнего. Кроме того, этопо умолчанию. Barney
@ Барни Нет, без перерыва вы можете перейти к следующему делу. Seiyria
2

что здесь есть много хороших ответов, но что произойдет, если нам нужно проверить более 10 случаев? Вот мой собственный подход:

 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'));
Это злоупотребление заявлением о смене. Простоif (accessDenied.includes(varName)) return 'Access Denied!'; return 'Access Allowed.' более чем достаточно Mihail Malostanidis
-3

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Example1</title>
    <link rel="stylesheet" href="css/style.css">
    <script src="js/jquery-1.11.3.min.js" type="text/javascript"></script>
    <script>
        function display_case(){
            var num =   document.getElementById('number').value;

                switch(num){

                    case (num = "1"):
                    document.getElementById("result").innerHTML = "You select day Sunday";
                    break;

                    case (num = "2"):
                    document.getElementById("result").innerHTML = "You select day  Monday";
                    break;

                    case (num = "3"):
                    document.getElementById("result").innerHTML = "You select day  Tuesday";
                    break;

                    case (num = "4"):
                    document.getElementById("result").innerHTML = "You select day  Wednesday";
                    break;

                    case (num = "5"):
                    document.getElementById("result").innerHTML = "You select day  Thusday";
                    break;

                    case (num = "6"):
                    document.getElementById("result").innerHTML = "You select day  Friday";
                    break;

                    case (num = "7"):
                    document.getElementById("result").innerHTML = "You select day  Saturday";
                    break;

                    default:
                    document.getElementById("result").innerHTML = "You select day  Invalid Weekday";
                    break
                }

        }
    </script>


    <center>
        <div id="error"></div>
        <center>
            <h2> Switch Case Example </h2>
            <p></p>
            <input type="text" id="number">
            <button onclick="display_case();">Check</button><br>
            <div id="result"><b></b></div>
        </center>
    </center>

Почему бы не поместить дневную стоимость в кейс иdocument.getElementById("result").innerHTML = ....за пределами коммутатора и добавить результат дня значение в конце? Steffo Dimfelt
Это не то, какswitch Заявление должно работать. Это'простоcase "1":нетcase (num = "1"): Sebastian Simon
классическое включение jquery :) ptim
@Xufox Мне нравится, как он буквально переписываетnum но это все еще работает, потому чтоswitch уже был оценен, и присвоение дает значение. Это программирование с помощью мутации / машинного обучения во всей красе. Mihail Malostanidis
5

Вы можете использоватьв' оператор ...

полагается на вызов объекта / хеша ...

так что это так быстро, как JavaScript может быть ...

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

Наслаждайся, ZEE

как это связано с переключением? Вы можете это уточнить? Z. Khullah
Привет Мэтт ... яЯ представляю это здесь как доказательство концепции ... в любом случае, эта форма обеспечивает вам большую функциональность и гибкость ... и вы используете ее, только если хотите ... или если вы обнаружите ограничение в своей обычной форме ведения дел ... Рассматривайте их как еще один инструмент в вашем наборе инструментов ... ZEE
почему вы хотите сделать свой код "трудно читать, Первое, что мне сказали как программисту, было написать код с мыслью, что следующий человек, читающий ваш код, - серийный убийца, владеющий топором, и он ненавидит неспособность понять код. MattE
67

Это работает в обычном 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);

Приветствия.

@believesInSanta it 's буквально обычный случай падения со странным форматированием (пробелы вместо новых строк) Mihail Malostanidis
0

что вам нужно повторить несколькоcaseкаждый раз, когда вы можете вызвать функцию, которая имеетswitch, Более надежное решение - иметькарта илитолковый словарь.

Вот пример

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

10

Используя ES6, вы можете сделать это:

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

Или для более ранних версий JavaScript вы можете сделать это:

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

Обратите внимание, что это победилоработать в старых браузерах IE, но вы можете довольно легко их исправить. Смотри вопросопределить, есть ли строка в списке в JavaScript для дополнительной информации.

3

Это зависит. переключатель оценивает один раз и только один раз. После матча все последующие дела доперерыв' огонь независимо от того, что говорит дело.

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>

15

итьdifferent case without break как дано ниже:

   <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 распространенная техника в множестве языков, не связанных с JS drAlberT
3

В узле кажется, что вы можете сделать это:

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

Это делает в некоторых случаях намного более компактный код.

@AfshinMehrabani Возможно, я проверял это только в контексте nodejs. Automatico
Я думаю, что синтаксис такой же, как в других средах JS. Afshin Mehrabani
-2

Вы можете написать это так:

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

   default: 
       alert('Default case');
       break;
}         
Это тот же ответ, как и все остальные, я исправлю что вы забыли, но подумайте об удалении этого. Gaunt
-1

когда внутри функции

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

6

вы можете использовать выражения для динамической установки значений условий в switch, например:

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

Так что в вашей проблеме вы можете сделать что-то вроде:

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

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

хотя не так много СУХОГО ..

еще не проверял но было бы интересно доработатьvarName внутри выражения case ожидайте, что varName кешируется. Valen
хорошо для стоимостиvarName кэшируется Valen
1

Я использую так:

switch (true){
     case /Pressure/.test(sensor):{
        console.log('Its pressure!');
        break;
     }
     case /Temperature/.test(sensor):{
        console.log('Its temperature!');
        break;
     }
}
Ты ненужно использоватьg флаг, так как тытолько используя регулярные выражения один раз и выбрасывая их. На самом деле, если вы держите их вне функции,g флаг будет вредить вам, пытаясь найти соответствие из индекса, отличного от 0, в последующем.test(s. Я также исправил опечатку, где был включен корпус переключателяsensor переменная и неtrue константа для сопоставления логических выражений. Смотрите редактирование. Mihail Malostanidis
-5

просто переключите состояние переключателя

switch (true) {
    case (function(){ return true; })():
        alert('true');
        break;
    case (function(){ return false; })():
        alert('false');
        break;
    default:
        alert('default');
}
Я думаю, что он имел в виду, что вы можете поместить в функцию выражение, которое будет оценивать и возвращать динамическое значение для случая, тем самым позволяя создавать всевозможные сложные условия. Z. Khullah
Для этой заметки @StefanoFavero вам на самом деле не нужна функция, просто(expression) в скобках, а возвращаемое значение должно быть входным. Смотри мой ответ Z. Khullah
Если в качестве выражения переключателя указать true, вдело" оператор (ы), вы можете оценить все, что вы хотите, при условии, что вы возвращаете логическое значение Stefano Favero
2
switch (myVariable)
{
  case "A":
  case "B":
  case "C": 
    // Do something
    break;
  case "D":
  case "E":
    // Do something else
    break;
  default: 
    // Default case
    break;
}

если значение myVariable равно A, B или C, он выполнит код в случае «C»:.

-1 так как эта мимика принята 5 лет назад ответом, не добавляет новую информацию, фактически скрывает объяснения и терминологию. Я'Я бы удалил его, если бы мог. Dmitry Shevkoplyas

Похожие вопросы