No SQL, podemos ver se uma string está em uma lista como esta:
Column IN ('a', 'b', 'c')
Qual é uma boa maneira de fazer isso em JavaScript? É tão desajeitado fazer isso:
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
// do something
}
E não tenho certeza sobre o desempenho ou a clareza disso:
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
// do something
}
Ou pode-se usar a função switch:
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
Mas isso é uma bagunça horrível. Alguma ideia?
Nesse caso, tenho que usar o Internet Explorer 7 para uma página da intranet corporativa. Portanto ['a', 'b', 'c'].indexOf(str) !== -1
, não funcionará nativamente sem um pouco de açúcar de sintaxe.
javascript
string
list
ErikE
fonte
fonte
Respostas:
Você pode ligar para
indexOf
:fonte
Array.prototype.indexOf
é que ele não funcionará no IE, infelizmente até o IE8 não possui esse método.Array.indexOf
existe antes de substituir oArray.prototype.indexOf
que não é a mesma coisa. Eu recomendaria a implementação feita pela Mozilla disponível aqui: developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/…EcmaScript 6
Se você estiver usando o ES6, poderá criar uma matriz dos itens e usar
includes
:Isto tem algumas vantagens inerentes sobre
indexOf
porque ele pode corretamente testar a presença deNaN
na lista, e pode igualar faltando elementos da matriz, tais como o do meio em[1, , 2]
queundefined
.includes
também funciona em matrizes digitadas em JavaScript , comoUint8Array
.Se você estiver preocupado com o suporte ao navegador (como o IE ou o Edge), verifique
Array.includes
em CanIUse.Com e, se desejar direcionar um navegador ou uma versão do navegador que está faltandoincludes
, recomendo o polyfill.io para o polyfilling.Sem uma matriz
Você pode adicionar uma nova
isInList
propriedade às seqüências de caracteres da seguinte maneira:Em seguida, use-o assim:
Você pode fazer a mesma coisa por
Number.prototype
.Array.indexOf
Se você estiver usando um navegador moderno,
indexOf
sempre funciona. No entanto, para o IE8 e versões anteriores, você precisará de um polyfill.Se
indexOf
retornar -1, o item não estará na lista. Lembre-se, porém, de que esse método não será verificado corretamenteNaN
e, embora possa corresponder a um explícitoundefined
, não pode corresponder a um elemento ausenteundefined
como na matriz[1, , 2]
.Polyfill para
indexOf
ouincludes
no IE, ou qualquer outro suporte ao navegador / versão faltaSe você não quiser usar um serviço como o polyfill.io, como mencionado acima, sempre poderá incluir nos seus próprios polyfills personalizados compatíveis com os padrões do código-fonte. Por exemplo, a Mozilla Developer Network tem uma para
indexOf
.Nessa situação em que tive que criar uma solução para o Internet Explorer 7, "rolei minha própria" versão mais simples da
indexOf()
função que não é compatível com os padrões:No entanto, não acho que modificar
Array.prototype
seja a melhor resposta a longo prazo. ModificaçõesObject
eArray
protótipos em JavaScript podem levar a erros graves. Você precisa decidir se isso é seguro em seu próprio ambiente. É importante notar que a iteração de uma matriz (quando Array.prototype adicionou propriedades)for ... in
retornará o novo nome da função como uma das chaves:Seu código pode funcionar agora, mas no momento em que alguém no futuro adicionar uma biblioteca ou plug-in JavaScript de terceiros que não esteja protegendo zelosamente contra chaves herdadas, tudo poderá ser interrompido.
A maneira antiga de evitar essa quebra é, durante a enumeração, verificar cada valor para ver se o objeto realmente o possui como uma propriedade não herdada
if (arr.hasOwnProperty(x))
e somente então trabalhar com issox
.A nova forma ES6 para evitar este problema chave extra-é usar
of
, em vez dein
,for (let x of arr)
. No entanto, a menos que você possa garantir que todas as suas bibliotecas de código e de terceiros sigam estritamente esse método, para os fins desta pergunta você provavelmente desejará usarincludes
como indicado acima.fonte
indexOf
fornecido pelo MDN. Basicamente, faz a mesma coisa, mas com alguns curtos-circuitos para facilitar a avaliação.A maioria das respostas sugere o
Array.prototype.indexOf
método, o único problema é que ele não funcionará em nenhuma versão do IE anterior ao IE9.Como alternativa, deixo mais duas opções que funcionarão em todos os navegadores:
fonte
"HiFooThere"
- eu usaria com/^(?:Foo|Bar|Baz)$/
(início da sequência, grupo não capturante, final da sequência).indexOf
agora é suportado no IE 9 e superior, de acordo com o MDN .As matrizes têm um
indexOf
método que pode ser usado para procurar por strings:fonte
Um truque que eu usei é
Você poderia fazer algo como
fonte
var i=a.length;while (i--) {/*use a[i]*/}
é o método de loop mais rápido (se a ordem inversa for aceitável).Aqui está o meu:
Este é mais rápido se você estiver bem ao passar uma matriz:
Aqui está o jsperf: http://jsperf.com/bmcgin-inlsit
fonte
Array
protótipo: talvez algo parecidoArray.prototype.contains
.RegExp
é universal, mas eu entendo que você está trabalhando com matrizes. Então, confira essa abordagem. Eu uso, e é muito eficaz e rápido!Você também pode aplicar algumas modificações, ou seja:
One-liner
Não diferencia maiúsculas de minúsculas
E muitos outros!
fonte
Usando indexOf (não funciona com o IE8).
Para dar suporte ao IE8, você pode implementar o indexOf do Mozilla.
Expressões regulares via String.prototype.match (docs).
fonte
Parece que você precisa usar a função in_array.
jQuery -> inArray
Protótipo -> Array.indexOf
Ou, veja estes exemplos se você não estiver usando jQuery ou Prototype:
Nota estilística: as variáveis denominadas thisthing thatthing, devem ser nomeadas para informar algo sobre o que elas contêm (substantivo).
fonte
Além de
indexOf
(que outros pôsteres sugeriram), o uso do Enumerable.include () do protótipo pode torná-lo mais limpo e conciso:fonte
Obrigado pela pergunta e pela solução usando o método Array.indexOf.
Eu usei o código dessa solução para criar uma função inList () que, IMO, tornaria a escrita mais simples e a leitura mais clara:
USO:
fonte
'Houston'.inList(['LA', 'New York', 'Houston'])
. Talvezif (!String.prototype.inList) {String.prototype.inList = function(arr) {return arr.indexOf(this) >= 0};}
ou usando seuwhile
método.Estou surpreso que ninguém tenha mencionado uma função simples que usa uma string e uma lista.
fonte
int
, onde algumas pessoas podem se deparar com essa pergunta procurando umbool
retorno. Achei que isso poderia ajudar algumas pessoas.Minha solução resulta em uma sintaxe como esta:
E eu implemento isso estendendo o protótipo básico de Objeto, assim:
Como alternativa, podemos nomear o método isInArray (mas provavelmente não o inArray) ou simplesmente isIn.
Vantagens: Simples, direto e auto-documentado.
fonte
myValues[key];
onde myValues é um objeto e key é qualquer sequência ou número.Uma versão simplificada da resposta do SLaks também funciona:
.... desde strings são uma espécie de matrizes próprias. :)
Se necessário, implemente a função indexof para o Internet Explorer, conforme descrito antes de mim.
fonte