сокращение для объединения логических операторов в JavaScript? - PullRequest
8 голосов
/ 29 мая 2010

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

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

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

Спасибо!

Ответы [ 7 ]

5 голосов
/ 29 мая 2010
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
}
4 голосов
/ 29 мая 2010

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

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

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

2 голосов
/ 29 мая 2010

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

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

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

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

1 голос
/ 29 мая 2010
var value= -55;
switch(value){
    case 1: case 16: case -55: case 42.5: case 'something': 
        alert(value); break;        

}
0 голосов
/ 10 сентября 2010

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

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

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

0 голосов
/ 29 мая 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
}
0 голосов
/ 29 мая 2010
Переключатель

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

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

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

...