EcmaScript 6
Si está utilizando ES6, puede construir una matriz de los elementos y usar includes
:
['a', 'b', 'c'].includes('b')
Esto tiene algunas ventajas inherentes sobre indexOf
porque puede probar correctamente la presencia de NaN
la lista, y puede igualar faltan elementos de la matriz como la del medio en [1, , 2]
que undefined
. includes
también funciona en matrices escritas en JavaScript como Uint8Array
.
Si le preocupa la compatibilidad con el navegador (como IE o Edge), puede consultar Array.includes
en CanIUse.Com , y si desea apuntar a un navegador o una versión de navegador que falta includes
, recomiendo polyfill.io para polyfilling.
Sin una matriz
Puede agregar una nueva isInList
propiedad a las cadenas de la siguiente manera:
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;
}
}
Luego úsalo así:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
Puedes hacer lo mismo por Number.prototype
.
Array.indexOf
Si está utilizando un navegador moderno, indexOf
siempre funciona. Sin embargo, para IE8 y versiones anteriores, necesitará un polyfill.
Si indexOf
devuelve -1, el elemento no está en la lista. Sin embargo, tenga en cuenta que este método no verificará correctamente NaN
y, aunque puede coincidir con un explícito undefined
, no puede coincidir con un elemento que falta undefined
como en la matriz [1, , 2]
.
Polyfill para indexOf
o includes
en IE, o cualquier otro navegador / versión que carece de soporte
Si no desea utilizar un servicio como polyfill.io como se mencionó anteriormente, siempre puede incluir en su propio código fuente polyfills personalizados que cumplan con los estándares. Por ejemplo, Mozilla Developer Network tiene uno para indexOf
.
En esta situación en la que tuve que hacer una solución para Internet Explorer 7, "desarrollé mi propia versión" más simple de la indexOf()
función que no cumple con los estándares:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
Sin embargo, no creo que modificar Array.prototype
sea la mejor respuesta a largo plazo. La modificación Object
y los Array
prototipos en JavaScript pueden provocar errores graves. Debe decidir si hacerlo es seguro en su propio entorno. La nota principal es que iterar una matriz (cuando Array.prototype ha agregado propiedades) for ... in
devolverá el nuevo nombre de la función como una de las teclas:
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!
Su código puede funcionar ahora, pero en el momento en que alguien en el futuro agregue una biblioteca de JavaScript de terceros o un complemento que no esté protegiendo celosamente contra las claves heredadas, todo puede romperse.
La forma antigua de evitar esa ruptura es, durante la enumeración, verificar cada valor para ver si el objeto realmente lo tiene como una propiedad no heredada con if (arr.hasOwnProperty(x))
y solo luego trabajar con eso x
.
La nueva forma ES6 para evitar este problema llave extra-es utilizar of
en lugar de in
, for (let x of arr)
. Sin embargo, a menos que pueda garantizar que todo su código y las bibliotecas de terceros se adhieran estrictamente a este método, a los fines de esta pregunta, es probable que solo desee usar includes
como se indicó anteriormente.