Переключить оператор несколько случаев в JavaScript

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

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

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

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

 surfmuggle21 февр. 2018 г., 22:25
Тому, кто проголосовал, чтобы закрыть этот вопрос. Ему более 5 лет, и он уже получил ответ - зачем закрытое голосование?
 evolutionxbox28 февр. 2018 г., 11:31
@AfshinMehrabani может быть это можно защитить, а не закрыть?
 Afshin Mehrabani22 февр. 2018 г., 10:28
@surfmuggle, потому что этоНет необходимости добавлять больше ответов.

Ответы на вопрос(17)

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

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

cases[ varName ] ? cases[ varName ]() : cases._default();
 Clint Eastwood17 нояб. 2014 г., 14:53
Всегда можно поцарапать левое ухо, пропустив его правую руку через затылок ... (извините за мой английский, я имею в виду: "всегда можно все усложнить настолько, насколько это возможно ... в этом случае, избегая оператора switch в пользу этого сложного решения,кажется, что это правильно ...)
 michael07 мая 2016 г., 20:51
Я действительно поражен тем, как это набрало 34 голоса. С точки зрения читабельности и ремонтопригодности, это абсолютно ужасно. Если я хочу увидеть, какие условия будут вызывать что-то, то заявление о кейсе невероятно просто и легко увидеть, посмотрев на ярлыки. С другой стороны, ваша версия потребует, чтобы кто-то читал почти каждую строку и видел, что вы назначили. Это также становится еще хуже, чем больше дел вы хотите сопоставить.
 Karl Gjertsen04 сент. 2017 г., 20:47
Это ужасная функция. Как младший разработчик должен быстро взглянуть на это и понять это? Да, оператор switch занимает больше места, но его легче отлаживать и поддерживать.
 elclanrs17 нояб. 2014 г., 21:57
Неа,switch это антипаттерн в моей книге. Это совсем не сложно, наоборот, это общая альтернатива, и, очевидно, она лучше подходит для сопровождения и рефакторинга, поскольку теперь вы можете перемещать дела, потому что вы получили выражения, а не операторы.
 Mnebuerquo24 июл. 2014 г., 15:58
Я всегда добавляю комментарий//fallthrough на местеbreak всякий раз, когда я намеренно опускаюbreak, Это помогает определить, когда этоошибка и когда этос намеренным
 contactmatt12 нояб. 2014 г., 16:01
Интуитивный подход. Однако для удобства чтения яЯ рекомендую использовать собственный оператор switch.
 Eric Elliott22 сент. 2013 г., 13:28
Я определенно предпочитаю эту версию. Падение - склонная к ошибкам особенностьswitch ... case, Это'Слишком легко забытьbreak заявление, и если вы используете провалиться намеренно, те забылиbreak Заявления могут быть очень трудно обнаружить. Эта версия метода поиска также имеет много замечательных функций, которыеswitch ... case недостатки, такие как динамическая расширяемость или возможность полностью заменить объект для выполнения переключения режимов. Это'Кроме того, их проще поддерживать в чистом виде, и это может привести к созданию более удобного кода. Увидетьericleads.com/2012/12/switch-case-considered-harmful
 wizzwizz419 июл. 2016 г., 18:41
@michael. Это было опубликовано давным-давно по вопросу, связанному с MDN. КонечноУ тебя есть голоса. : - /
 Martin Dawson03 янв. 2017 г., 23:06
Это ужасно, если единственная причина, по которой вы это делаете, заключается в том, что у вас есть боязнь менять высказывания. Я бы разозлился, если бы мне пришлось прочитать это, чтобы понять, что это то же самое, что и переключатель. ПОЦЕЛУЙ
 Jefferey Cave20 февр. 2016 г., 00:45
@ClintEastwood Я бы согласился, за исключением того, что мне часто нравится абстрагироваться от действий, которые необходимо предпринять. Если я'я обертываю кучу обработчиков для использования кем-то еще,приятно дать им кучу помеченных функций: они невообще не нужно смотреть на функции, просто примените правильную на основе метки.

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

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

так что это так быстро, как 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. Khullah06 дек. 2017 г., 15:52
как это связано с переключением? Вы можете это уточнить?
 MattE15 апр. 2018 г., 17:17
почему вы хотите сделать свой код "трудно читать, Первое, что мне сказали как программисту, было написать код с мыслью, что следующий человек, читающий ваш код, - серийный убийца, владеющий топором, и он ненавидит неспособность понять код.
 ZEE16 апр. 2018 г., 18:12
Привет Мэтт ... яЯ представляю это здесь как доказательство концепции ... в любом случае, эта форма обеспечивает вам большую функциональность и гибкость ... и вы используете ее, только если хотите ... или если вы обнаружите ограничение в своей обычной форме ведения дел ... Рассматривайте их как еще один инструмент в вашем наборе инструментов ...

что вам нужно повторить несколько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>

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»:.

 Dmitry Shevkoplyas25 июл. 2018 г., 20:00
-1 так как эта мимика принята 5 лет назад ответом, не добавляет новую информацию, фактически скрывает объяснения и терминологию. Я'Я бы удалил его, если бы мог.
Решение Вопроса

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

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

   default: 
       alert('Default case');
}
 Seiyria24 апр. 2015 г., 19:21
@ Барни Нет, без перерыва вы можете перейти к следующему делу.
 Barney24 апр. 2015 г., 19:22
@Seiyira по определению, нет следующего дела после последнего. Кроме того, этопо умолчанию.
 CupawnTae11 авг. 2015 г., 00:10
@ Нет, правда, я просто пытался быть более конкретным, но я понимаю, что это было неоднозначно, я должен был сказать "прошлой", Кроме того, лично я бы неотредактировалbreak из ответа, как я думаю, 'Это вопрос личных предпочтений - многие люди будут выступать заbreak на каждый случай, дажеdefaultи я подозреваю, что Кеннитм знал, что он намеревался.
 kennytm03 сент. 2013 г., 09:10
@nafg: попробуйswitch(1), Метка здесь - просто выражение запятой.
 CupawnTae24 апр. 2015 г., 21:22
(И да,break вdefault дело излишне)
 nafg03 сент. 2013 г., 06:18
Каким-то образом это работает для меня в Chrome, в консоли javascript:switch('10') { case 1, '10': console.log('ok') } печатьok
 CupawnTae24 апр. 2015 г., 21:21
@ Барни, я подозреваю, что путаница в том, что ты сказал "каждый» когда ты имел ввидуочень", Я также прочитал это какконец каждого высказывания вначале
 Barney23 нояб. 2014 г., 13:09
неbreak на каждом конце заявления избыточны?
 Neto Yo10 авг. 2015 г., 20:29
@CupawnTae да, в этом случае избыточно, но помните, что метка по умолчанию не может быть последней, поэтому имейте в виду.
 Aeoril03 нояб. 2012 г., 10:52

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

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

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

 Automatico01 сент. 2015 г., 14:09
@AfshinMehrabani Возможно, я проверял это только в контексте nodejs.
 Afshin Mehrabani01 сент. 2015 г., 13:02
Я думаю, что синтаксис такой же, как в других средах JS.

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

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

 Mihail Malostanidis02 февр. 2019 г., 15:12
@believesInSanta it 's буквально обычный случай падения со странным форматированием (пробелы вместо новых строк)

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

switch (true) {
    case (function(){ return true; })():
        alert('true');
        break;
    case (function(){ return false; })():
        alert('false');
        break;
    default:
        alert('default');
}
 Stefano Favero02 февр. 2017 г., 09:24
Если в качестве выражения переключателя указать true, вдело" оператор (ы), вы можете оценить все, что вы хотите, при условии, что вы возвращаете логическое значение
 Z. Khullah06 дек. 2017 г., 16:01
Для этой заметки @StefanoFavero вам на самом деле не нужна функция, просто(expression) в скобках, а возвращаемое значение должно быть входным. Смотри мой ответ
 Z. Khullah06 дек. 2017 г., 15:57
Я думаю, что он имел в виду, что вы можете поместить в функцию выражение, которое будет оценивать и возвращать динамическое значение для случая, тем самым позволяя создавать всевозможные сложные условия.

Используя 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 для дополнительной информации.

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

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

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

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

 ptim08 июл. 2016 г., 02:02
классическое включение jquery :)
 Steffo Dimfelt22 авг. 2018 г., 11:00
Почему бы не поместить дневную стоимость в кейс иdocument.getElementById("result").innerHTML = ....за пределами коммутатора и добавить результат дня значение в конце?
 Sebastian Simon01 февр. 2017 г., 22:11
Это не то, какswitch Заявление должно работать. Это'простоcase "1":нетcase (num = "1"):
 Mihail Malostanidis02 февр. 2019 г., 15:15
@Xufox Мне нравится, как он буквально переписываетnum но это все еще работает, потому чтоswitch уже был оценен, и присвоение дает значение. Это программирование с помощью мутации / машинного обучения во всей красе.

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

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

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

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>

ить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>

Пожалуйста, посмотрите пример, нажмите нассылка на сайт

 drAlberT12 дек. 2013 г., 16:06
Это's распространенная техника в множестве языков, не связанных с JS

вы можете использовать выражения для динамической установки значений условий в 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');
}

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

 Valen27 янв. 2018 г., 04:30
хорошо для стоимостиvarName кэшируется
 Valen27 янв. 2018 г., 04:22
еще не проверял но было бы интересно доработатьvarName внутри выражения case ожидайте, что varName кешируется.

что здесь есть много хороших ответов, но что произойдет, если нам нужно проверить более 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'));
 Mihail Malostanidis02 февр. 2019 г., 14:55
Это злоупотребление заявлением о смене. Простоif (accessDenied.includes(varName)) return 'Access Denied!'; return 'Access Allowed.' более чем достаточно

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

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

Ваш ответ на вопрос