Estou verificando uma variável, digamos foo
, para igualdade com vários valores. Por exemplo,
if( foo == 1 || foo == 3 || foo == 12 ) {
// ...
}
O ponto é que é bastante código para uma tarefa tão trivial. Eu vim com o seguinte:
if( foo in {1: 1, 3: 1, 12: 1} ) {
// ...
}
mas também isso não me atrai completamente, porque tenho que dar valores redundantes aos itens no objeto.
Alguém conhece uma maneira decente de fazer uma verificação de igualdade em relação a vários valores?
javascript
pimvdb
fonte
fonte
Respostas:
Você pode usar uma matriz e
indexOf
:fonte
indexOf
só está disponível desde a 5ª edição do ECMAScript.No ECMA2016, você pode usar o método includes . É a maneira mais limpa que eu já vi. (Compatível com todos os principais navegadores, exceto o IE (o Polyfill está no link)
fonte
if([a,b,c].includes(foo))
ou cordasif(['a','b','c'].includes(foo))
if([a,b,c].includes(foo))
porque aspas fará com que seja uma string. @HastigZusammenstellenUsando as respostas fornecidas, acabei com o seguinte:
Pode ser chamado como:
Edit: me deparei com esse 'truque' ultimamente, que é útil se os valores são cadeias de caracteres e não contêm caracteres especiais. Para caracteres especiais, torna-se feio devido à fuga e também é mais suscetível a erros.
Para ser mais preciso, isso verificará a sequência exata, mas, novamente, é mais complicado para um simples teste de igualdade:
fonte
in
é uma palavra-chave em Javascript. Por exemplo, a execuçãofunction in() {}; in()
resulta em um erro de sintaxe, pelo menos no Firefox, e não sei por que seu código não. :-)Object.prototype
, pois afeta defor (foo in bar)
maneira infeliz. Talvez mude parafunction contains(obj) { for (var i = 1; i < arguments.length; i++) if (arguments[i] === obj) return true; return false; }
e passe o objeto como argumento?Object.prototype
como você também mencionou. No entanto, prefiro assim, pois a notação para verificação é adorávelfoo.in(1, 2, "test", Infinity)
, fácil e fácil como torta.in()
da maneira regular falha no Chrome também, mas obras de protótipo ... :)Você pode escrever
if(foo in L(10,20,30))
se definirL
comofonte
'remove' in L(1, 3, 12)
, embora não tenha especifique 'remover' para ser colocado na lista.Isso é facilmente extensível e legível:
Mas não necessariamente mais fácil :)
fonte
Observe que indexOf não está no ECMAScript principal. Você precisará ter um snippet para o IE e possivelmente outros navegadores que não suportam Array.prototype.indexOf.
fonte
Além disso, como os valores nos quais você está verificando o resultado são todos exclusivos, você também pode usar o Set.prototype.has () .
fonte
Agora você pode ter uma solução melhor para resolver esse cenário, mas de outra maneira que preferi.
Eu preferi a solução acima da verificação indexOf, onde você também precisa verificar o índice.
inclui documentos
fonte
Gostei da resposta aceita, mas achei que seria legal permitir que ela também recebesse matrizes, então a expandi para isso:
Você pode remover a coerção de tipos alterando
==
para===
.fonte
Se você tiver acesso ao Underscore, poderá usar o seguinte:
contains
costumava trabalhar no Lodash também (antes da V4), agora você precisa usarincludes
fonte
Esta é uma pequena função auxiliar arror:
Mais informações aqui ...
fonte
const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].some(option => option === valToCheck); // false
includes
é a melhor opção, como na resposta de @ alister: #const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].includes(valToCheck); // false
Eu simplesmente usei a função jQuery inArray e uma matriz de valores para fazer isso:
fonte
Para a posteridade, convém usar expressões regulares como alternativa. Bom suporte ao navegador também (ref. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match#Browser_compatibility )
Tente isto
fonte