2012-02-02 2 views
29

Что является самым красивым способом сравнить одно значение с несколькими параметрами?Javascript: Самый лучший способ сравнить одно значение с несколькими значениями

Я знаю, что есть много способов сделать это, но я ищу наиболее аккуратный.

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

if (foobar == (foo||bar)) { 
    //do something 
} 
+0

Вы можете использовать функцию проверки javascript, например 'if (/foo|bar|ow|my|javascript|works/.test (foobar)) {/ * сделать что-то * /}' Этот вопрос [simular to mine] (http://stackoverflow.com/questions/12743248/how-to-nest-or-statements-in-javascript) –

ответ

51

Не пытайтесь быть слишком проницательным, особенно если это не влияет на производительность. Если у вас действительно есть целая куча сравнений, просто отформатируйте ее.

if (foobar === foo || 
    foobar === bar || 
    foobar === baz || 
    foobar === pew) { 
    //do something 
} 
+0

В конце концов я дал вам это, потому что это самый читаемый ответ, даже если он не самый инновационный. – thelastshadow

+8

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

+2

Лучший совет, который я получу сегодня! :) – Codeformer

13

Вы можете использовать переключатель:

switch (foobar) { 
    case foo: 
    case bar: 
    // do something 
} 
+0

hmm. Меня это интригует, но я обеспокоен тем, что это разборчивость. – thelastshadow

+0

вы можете использовать это для динамических списков значений через – caleb

+3

Почему downvote? Если вы не объясните, что это такое, что вы считаете неправильным, оно не может улучшить ответ. – Guffa

47

Что я использую, чтобы сделать, это поместить эти несколько значений в массиве, как

var options = [foo, bar]; 

, а затем используйте IndexOf()

if(options.indexOf(foobar) > -1){ 
    //do something 
} 

для красивости:

if([foo, bar].indexOf(foobar) +1){ 
    //you can't get any more pretty than this :) 
} 

и для старых браузеров:
(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/IndexOf)

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function (searchElement /*, fromIndex */) { 
     "use strict"; 
     if (this == null) { 
      throw new TypeError(); 
     } 
     var t = Object(this); 
     var len = t.length >>> 0; 
     if (len === 0) { 
      return -1; 
     } 
     var n = 0; 
     if (arguments.length > 0) { 
      n = Number(arguments[1]); 
      if (n != n) { // shortcut for verifying if it's NaN 
       n = 0; 
      } else if (n != 0 && n != Infinity && n != -Infinity) { 
       n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
      } 
     } 
     if (n >= len) { 
      return -1; 
     } 
     var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 
     for (; k < len; k++) { 
      if (k in t && t[k] === searchElement) { 
       return k; 
      } 
     } 
     return -1; 
    } 
} 
+1

'indexOf' для массивов, предоставляемых только в IE, начиная с версии 9, поэтому я бы не стал использовать его до тех пор, пока 8 не выйдет из рынка (далеко не все, к сожалению). Тем не менее, [MDN] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf) содержит пример кода реализации для браузеров, которые его не поддерживают. – Reid

+1

Метод 'Array.indexOf' поддерживается только в Javascript 1.6 и более поздних версиях, поэтому вам понадобится резерв для старых браузеров. – Guffa

+0

Reid: Хорошая точка. Андре: В вашем правлении отсутствует foobar, но, конечно, он опрятен. – thelastshadow

11

Поскольку никто не добавил очевидное решение еще который отлично работает в течение двух сравнений, я он будет предлагать:

if (foobar == foo || foobar == bar) { 
    //do something 
} 

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

// pre-construct the Set 
var tSet = new Set([foo, bar, test1, test2, test3]); 

// test the Set at runtime 
if (tSet.has(foobar)) { 
    // do something 
} 

Для предварительной ES6, вы можете получить Установите полиполку, которой их много. Один из них описан в этом other answer.

+0

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

0

(foobar == foo || foobar == bar) В противном случае, если вы сравниваете выражения, основанные только на одном целочисленном, перечисляемом значении или объекте String, вы можете использовать переключатель. См. The switch Statement. Вы также можете использовать метод, предложенный Андре Альшадой Падезом. В конечном итоге то, что вы выбираете, должно зависеть от деталей того, что вы делаете.

15

Только для пинков, так как это Q &, похоже, о синтаксическом микроанализе, крошечного крошечного модификации предложения Андре Alçada Padez (ов):

(и, конечно, приходится пра -IE9 прокладка/Шив/polyfill он включен)

if (~[foo, bar].indexOf(foobar)) { 
    // pretty 
} 
6

Почему не используется indexOf из массива, как сильфон?

if ([foo, bar].indexOf(foobar) !== -1) { 
    // do something 
} 

Попросту Javascript, без рамки или библиотеки, но это будет not work on IE < 9.

0

Метод переключения (как упоминается Гуффа) работает очень хорошо. Тем не менее, настройки предупреждения по умолчанию в большинстве линтеров будут предупреждать вас об использовании провала. Это одна из основных причин, по которой я вообще использую коммутаторы, поэтому я почти игнорирую это предупреждение, но вы должны знать, что использование сквозной функции оператора switch может быть сложным. Однако в таких случаях я бы пошел на это.

+0

@Rahul только редактирование в backticks ** NOT ** * Правильное форматирование выполняется * – rene

1

Мне нравится симпатичная форма тестирования indexOf с массивом, но имейте в виду, что это не работает во всех браузерах (because Array.prototype.indexOf is not present in old IExplorers).

Однако есть аналогичный способ с помощью JQuery с функцией $.inArray():

if ($.inArray(field, ['value1', 'value2', 'value3']) > -1) { 
    alert('value ' + field + ' is into the list'); 
} 

Это может быть лучше, так что вы не должны проверить, если IndexOf существует.

Будьте внимательны при сравнении (не используйте == true/false), потому что $ .inArray возвращает индекс совпадающей позиции, где значение найдено, а если индекс равен 0, это было бы неверно, если он действительно существует в массиве.

Смежные вопросы