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 indexOfporque ele pode corretamente testar a presença de NaNna lista, e pode igualar faltando elementos da matriz, tais como o do meio em [1, , 2]que undefined. includestambé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.includesem 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 isInListpropriedade à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, indexOfsempre funciona. No entanto, para o IE8 e versões anteriores, você precisará de um polyfill.
Se indexOfretornar -1, o item não estará na lista. Lembre-se, porém, de que esse método não será verificado corretamente NaNe, embora possa corresponder a um explícito undefined, não pode corresponder a um elemento ausente undefinedcomo na matriz [1, , 2].
Polyfill para indexOfou includesno 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.prototypeseja a melhor resposta a longo prazo. Modificações Objecte Arrayprotó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 ... inretornará 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 includescomo indicado acima.