EcmaScript 6
Se você estiver usando o ES6, poderá criar uma matriz dos itens e usar includes
:
['a', 'b', 'c'].includes('b')
Isto tem algumas vantagens inerentes sobre indexOf
porque ele pode corretamente testar a presença de NaN
na lista, e pode igualar faltando elementos da matriz, tais como o do meio em [1, , 2]
que undefined
. includes
também funciona em matrizes digitadas em JavaScript , como Uint8Array
.
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á faltando includes
, 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:
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
Em seguida, use-o assim:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
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 corretamente NaN
e, embora possa corresponder a um explícito undefined
, não pode corresponder a um elemento ausente undefined
como na matriz [1, , 2]
.
Polyfill para indexOf
ou includes
no IE, ou qualquer outro suporte ao navegador / versão falta
Se 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:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
No entanto, não acho que modificar Array.prototype
seja a melhor resposta a longo prazo. Modificações Object
e Array
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:
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
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 isso x
.
A nova forma ES6 para evitar este problema chave extra-é usar of
, em vez de in
, 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á usar includes
como indicado acima.