Я проверяю переменную, скажем foo
, на равенство ряду значений. Например,
if( foo == 1 || foo == 3 || foo == 12 ) {
// ...
}
Дело в том, что это довольно много кода для такой тривиальной задачи. Я придумал следующее:
if( foo in {1: 1, 3: 1, 12: 1} ) {
// ...
}
но также это меня не полностью привлекает, потому что я должен дать избыточные значения элементам в объекте.
Кто-нибудь знает достойный способ проверки равенства нескольких значений?
javascript
pimvdb
источник
источник
Ответы:
Вы можете использовать массив и
indexOf
:источник
indexOf
она доступна только с 5-й редакции ECMAScript.В ECMA2016 вы можете использовать включает в себя метод. Это самый чистый способ, который я видел. (Поддерживается всеми основными браузерами, кроме IE (Polyfill находится по ссылке)
источник
if([a,b,c].includes(foo))
или строкif(['a','b','c'].includes(foo))
if([a,b,c].includes(foo))
потому что кавычки сделают это строкой. @HastigZusammenstellenИспользуя предоставленные ответы, я получил следующее:
Это можно назвать так:
Изменить: в последнее время я столкнулся с этим «трюком», который полезен, если значения являются строками и не содержат специальных символов. Для специальных символов это становится уродливым из-за экранирования, а также из-за этого более подвержено ошибкам.
Чтобы быть более точным, это будет проверять точную строку, но опять же, это более сложно для простого теста на равенство:
источник
in
это ключевое слово в Javascript. Например, запускfunction in() {}; in()
приводит к синтаксической ошибке, по крайней мере, в Firefox, и я не уверен, почему ваш код этого не делает. :-)Object.prototype
, так как это отрицательно сказываетсяfor (foo in bar)
. Возможно, измените его наfunction contains(obj) { for (var i = 1; i < arguments.length; i++) if (arguments[i] === obj) return true; return false; }
и передайте объект в качестве аргумента?Object.prototype
о котором вы также упомянули. Однако я предпочитаю этот способ, так как обозначения для проверки прекрасны, простоfoo.in(1, 2, "test", Infinity)
, проще простого.in()
обычным способом в Chrome тоже не работает, но прототип работает ... :)Вы можете писать,
if(foo in L(10,20,30))
если решитеL
бытьисточник
'remove' in L(1, 3, 12)
, хотя вы этого не сделали. укажите «удалить», чтобы добавить его в список.Это легко расширить и прочитать:
Но не обязательно проще :)
источник
Обратите внимание, что indexOf отсутствует в ядре ECMAScript. Вам понадобится фрагмент кода для IE и, возможно, других браузеров, которые не поддерживают Array.prototype.indexOf.
источник
Кроме того, поскольку значения, по которым вы проверяете результат, уникальны, вы также можете использовать Set.prototype.has () .
источник
Теперь у вас может быть лучшее решение для разрешения этого сценария, но другой способ, который я предпочел.
Я предпочел вышеуказанное решение проверке indexOf, где вам также нужно проверить index.
включает документы
источник
Мне понравился принятый ответ, но я подумал, что было бы неплохо разрешить ему также принимать массивы, поэтому я расширил его до этого:
Вы можете удалить приведение типов, изменив
==
на===
.источник
Если у вас есть доступ к Underscore, вы можете использовать следующее:
contains
раньше также работал в Lodash (до V4), теперь вам нужно использоватьincludes
источник
Это небольшая вспомогательная функция arror:
Подробнее здесь ...
источник
const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].some(option => option === valToCheck); // false
includes
становится лучшим вариантом, как в ответе @alister:const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].includes(valToCheck); // false
Я просто использовал JQuery inArray функции и массив значений для достижения этой цели :
источник
Для потомков вы можете использовать регулярные выражения в качестве альтернативы. Также довольно хорошая поддержка браузера (см. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match#Browser_compatibility )
Попробуй это
источник