короткая рука для цепочки логических операторов в javascript?

Есть ли лучший способ написать следующее условное выражение в javascript?

if ( value == 1 || value == 16 || value == -500 || value == 42.42 || value == 'something' ) {
  // blah blah blah
}

Я ненавижу, когда все эти логические ИЛИ связаны вместе. Мне интересно, есть ли какая-то стенография.

Спасибо!


person Travis    schedule 28.05.2010    source источник
comment
Голосование за закрытие как дубликата Проверить равенство переменных по списку значений; да, он новее, но ответы там гораздо более актуальные. Другими словами, это более «канонический» пост.   -  person Sebastian Simon    schedule 01.03.2021


Ответы (6)


var a = [1, 16, -500, 42.42, 'something'];
var value = 42;
if (a.indexOf(value) > -1){
// blah blah blah
}

Upd: пример служебной функции, предложенный в комментариях:

Object.prototype.in = function(){
  for(var i = 0; i < arguments.length; i++){
    if (this == arguments[i]) return true;
  }
  return false;
}

Итак, вы можете написать:

if (value.in(1, 16, -500, 42.42, 'something')){
// blah blah blah
}
person Li0liQ    schedule 28.05.2010
comment
Просто имейте в виду, что метод Array.prototype.indexOf недоступен в IE. - person Christian C. Salvadó; 29.05.2010
comment
@CMS Спасибо за ценное замечание. Хотя, можно сразу исправить. stackoverflow.com/questions/1744310/ - person Li0liQ; 29.05.2010
comment
Это могло бы стать хорошей вспомогательной функцией, позволяющей избежать усложнения инструкции if по сравнению с оригиналом. Просто передайте массив значений, и вуаля у вас есть сокращенный синтаксис. - person JohnFx; 29.05.2010
comment
Я бы настоятельно не рекомендовал создавать прототипы на Object. Помимо широко распространенного характера загрязнения пространства имен, существует высокий риск взлома кода, который использует объекты в качестве сопоставлений поиска. Лучше поместить такой служебный метод в файл Array.prototype. Кроме того, это позволяет вам использовать метод против вещей, которые не наследуются от Object, а именно «хост-объектов», таких как узлы DOM. - person bobince; 29.05.2010
comment
Не изменять объекты, которыми вы не владеете, особенно Object.prototype! - person Christian C. Salvadó; 29.05.2010

Вы можете расширить объект массива:

Array.prototype.contains = function(obj) {
  var i = this.length;
  while (i--) {
    if (this[i] == obj) {
      return true;
    }
  }
  return false;
}

Затем, если вы сохраните все эти значения в массиве, вы можете сделать что-то вроде MyValues.contains(value)

person Prescott    schedule 28.05.2010
comment
Если приведения типов не ожидается, я бы рекомендовал использовать === вместо ==, однако, по моему мнению, при таком подходе лучше всего использовать стандартную Array.prototype.indexOf, как @Li0liQ доступен изначально во всех браузерах, кроме IE. - person Christian C. Salvadó; 29.05.2010

нет, это сокращение.

в качестве альтернативы вы можете сделать switch

switch (value) {
case 1 :
case 16 :
case -500 :
    ....
}

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

person chris    schedule 28.05.2010
comment
Если он смешанный, вы можете привести значение к строке и выполнить сравнение строк. Медленнее, но возможно. Я также думаю, что этот вариант более... читабелен, чем представленный вариант indexOf. - person Matt S; 29.05.2010

переключатель является приемлемым выбором. Вы также можете использовать карту, в зависимости от сложности проблемы (при условии, что у вас больше, чем указано в вашем примере).

var accept = { 1: true, 16: true, '-500': true, 42.42: true, something: true };
if (accept[value]) {
  // blah blah blah
}

accept может быть сгенерирован программно из массива, конечно. Зависит от того, насколько часто вы планируете использовать этот шаблон. :/

person jimbo    schedule 28.05.2010

Ну, вы могли бы использовать оператор switch...

switch (value) {
  case 1    : // blah
              break;
  case 16   : // blah
              break;
  case -500 : // blah
              break;
  case 42.42: // blah
              break;
  case "something" : // blah
                     break;
}

Если вы используете JavaScript 1.6 или выше, вы можете использовать нотацию indexOf для массива:

if ([1, 16, -500, 42.42, "something"].indexOf(value) !== -1) {
   // blah
}

И для максимального хакерства вы можете привести значения к строкам (это работает для всех браузеров):

if ("1,16,-500,42.42,something".indexOf(value) !== -1) {
   // blah
}
person Matt Brock    schedule 28.05.2010

В попытке сделать еще один способ сделать это...

if (/^(1|16|-500|42.42|something)$/.test(value)) {
  // blah blah blah
}

Не нужно расширять прототипы массивов или что-то еще, просто используйте быстрое регулярное выражение для проверки значения!

person gnarf    schedule 09.09.2010