В SQL мы можем видеть, есть ли строка в списке следующим образом:
Column IN ('a', 'b', 'c')
Какой хороший способ сделать это в JavaScript? Это так неуклюже, чтобы сделать это:
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
// do something
}
И я не уверен насчет производительности или ясности этого:
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
// do something
}
Или можно использовать функцию переключения:
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
Но это ужасный беспорядок. Любые идеи?
В этом случае я должен использовать Internet Explorer 7, так как он предназначен для корпоративной интрасети. Так ['a', 'b', 'c'].indexOf(str) !== -1
что не будет работать изначально без некоторого синтаксического сахара.
javascript
string
list
ErikE
источник
источник
Ответы:
Вы можете позвонить
indexOf
:источник
Array.prototype.indexOf
том, что он не будет работать на IE, к сожалению, даже IE8 не хватает этого метода.Array.indexOf
перед тем, как переопределить, существует,Array.prototype.indexOf
что не одно и то же. Я бы порекомендовал реализацию, сделанную Mozilla, доступную здесь: developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/…EcmaScript 6
Если вы используете ES6, вы можете создать массив элементов и использовать
includes
:Это имеет некоторые неотъемлемые преимущества по сравнению с
indexOf
тем, что он может правильно проверять наличиеNaN
в списке и может сопоставлять отсутствующие элементы массива, такие как средний,[1, , 2]
сundefined
.includes
также работает с типизированными массивами JavaScript, такими какUint8Array
.Если вас беспокоит поддержка браузера (например, для IE или Edge), вы можете проверить
Array.includes
на CanIUse.Com , и если вы хотите указать браузер или версию браузера, которая отсутствуетincludes
, я рекомендую polyfill.io для полизаполнения.Без массива
Вы можете добавить новое
isInList
свойство в строки следующим образом:Тогда используйте это так:
Вы можете сделать то же самое для
Number.prototype
.Array.indexOf
Если вы используете современный браузер,
indexOf
всегда работает. Однако для IE8 и более ранних версий вам понадобится полифилл.Если
indexOf
возвращается -1, элемент отсутствует в списке. Однако помните, что этот метод не будет правильно проверятьNaN
, и хотя он может соответствовать явномуundefined
, он не может сопоставить отсутствующий элемент с тем,undefined
что и в массиве[1, , 2]
.Polyfill для
indexOf
илиincludes
в IE, или любой другой браузер / версия без поддержкиЕсли вы не хотите использовать такой сервис, как polyfill.io, как упомянуто выше, вы всегда можете включить в свой собственный пользовательский полифилл, совместимый со стандартами исходного кода. Например, в Mozilla Developer Network есть один для
indexOf
.В этой ситуации, когда мне нужно было найти решение для Internet Explorer 7, я «свернул свою» более простую версию
indexOf()
функции, которая не соответствует стандартам:Однако я не думаю, что изменение
Array.prototype
- лучший ответ в долгосрочной перспективе. МодификацииObject
иArray
прототипы в JavaScript могут привести к серьезным ошибкам. Вам нужно решить, насколько это безопасно в вашей среде. В первую очередь следует отметить, что повторение массива (когда Array.prototype имеет добавленные свойства) сfor ... in
вернет новое имя функции в качестве одного из ключей:Ваш код может работать сейчас, но в тот момент, когда кто-то в будущем добавит стороннюю библиотеку JavaScript или плагин, который не будет рьяно защищать от унаследованных ключей, все может сломаться.
Старый способ избежать этой поломки - во время перечисления проверять каждое значение, чтобы увидеть, действительно ли объект имеет его как не наследуемое свойство
if (arr.hasOwnProperty(x))
и только затем работать с нимx
.Новый ES6 способ избежать этого дополнительного ключа проблемы заключается в использовании
of
вместоin
,for (let x of arr)
. Однако, если вы не можете гарантировать, что весь ваш код и сторонние библиотеки строго придерживаются этого метода, то для целей этого вопроса вы, вероятно, просто захотите использовать,includes
как указано выше.источник
indexOf
MDN. Это в основном делает то же самое, но с парой коротких замыканий для легкой оценки.Большинство ответов предлагают
Array.prototype.indexOf
метод, единственная проблема заключается в том, что он не будет работать на любой версии IE до IE9.В качестве альтернативы я оставляю вам еще две опции, которые будут работать во всех браузерах:
источник
"HiFooThere"
- я бы пошел/^(?:Foo|Bar|Baz)$/
вместо этого (начало строки, группа без захвата, конец строки).indexOf
теперь поддерживается в IE 9 и выше в соответствии с MDN .У массивов есть
indexOf
метод, который можно использовать для поиска строк:источник
Я использовал трюк
Вы могли бы сделать что-то вроде
источник
var i=a.length;while (i--) {/*use a[i]*/}
самый быстрый метод цикла (если обратный порядок приемлем).Вот мой:
Это быстрее, если вы в порядке с передачей массива:
Вот этот jsperf: http://jsperf.com/bmcgin-inlsit
источник
Array
прототипе: может быть, что-то вродеArray.prototype.contains
.RegExp
универсален, но я понимаю, что вы работаете с массивами. Итак, проверьте этот подход. Я использую его, и это очень эффективно и быстро!Вы также можете применить некоторые модификации, а именно:
Один лайнер
Без учета регистра
И многие другие!
источник
Использование indexOf (он не работает с IE8).
Для поддержки IE8 вы можете реализовать Mozilla indexOf.
Регулярные выражения через String.prototype.match (документы).
источник
Похоже, вам нужно использовать функцию in_array.
jQuery -> inArray
Прототип -> Array.indexOf
Или посмотрите эти примеры, если вы не используете jQuery или Prototype:
Стилистическое примечание: переменные, названные thisthing thatthing, должны быть названы так, чтобы рассказать вам о том, что они содержат (существительное).
источник
В дополнение к
indexOf
(что предложили другие авторы) использование Enumerable.include () для прототипа может сделать это более аккуратным и лаконичным:источник
Спасибо за вопрос и решение с использованием метода Array.indexOf.
Я использовал код из этого решения для создания функции inList (), которая, IMO, сделает написание более простым, а чтение - более четким:
ИСПОЛЬЗОВАНИЕ:
источник
'Houston'.inList(['LA', 'New York', 'Houston'])
. Возможноif (!String.prototype.inList) {String.prototype.inList = function(arr) {return arr.indexOf(this) >= 0};}
или используя вашwhile
метод.Я удивлен, что никто не упомянул простую функцию, которая принимает строку и список.
источник
int
, где, как некоторые люди могут столкнуться с этим вопросом в поискахbool
возврата. Я подумал, что это может помочь нескольким людям.Мое решение приводит к синтаксису вроде этого:
И я реализую это, расширяя базовый прототип Object, например так:
В качестве альтернативы мы можем назвать метод isInArray (но, вероятно, не inArray) или просто isIn.
Преимущества: простой, понятный и самодокументируемый.
источник
myValues[key];
где myValues - это объект, а ключ - любая строка или число.Упрощенная версия ответа SLaks также работает:
.... так как строки сами по себе являются массивами. :)
Если необходимо, реализуйте функцию indexof для Internet Explorer, как описано выше.
источник