¿Cómo puedo comprobar si un array incluye un valor en JavaScript?

¿Cuál es la forma más concisa y eficiente de averiguar si un array de JavaScript contiene un valor?

Esta es la única forma que conozco de hacerlo:

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}

¿Existe una forma mejor y más concisa de hacerlo?

Esto está muy relacionado con la pregunta de Stack Overflow ¿La mejor manera de encontrar un elemento en un array de JavaScript? que trata de encontrar objetos en un array usando indexOf.

Actualización de 2019: Esta respuesta es de 2008 (¡11 años de antigüedad!) y no es relevante para el uso moderno de JS. La mejora de rendimiento prometida se basaba en un benchmark realizado en navegadores de aquella época. Puede que no sea relevante para los contextos modernos de ejecución de JS. Si necesitas una solución fácil, busca otras respuestas. Si necesitas el mejor rendimiento, haz un benchmark por ti mismo en los entornos de ejecución relevantes.

Como otros han dicho, la iteración a través de la matriz es probablemente la mejor manera, pero se ha demostrado que un bucle mientras decreciente es la forma más rápida de iterar en JavaScript. Así que usted puede querer reescribir su código de la siguiente manera:

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

Por supuesto, también puede extender el prototipo Array:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

Y ahora puedes usar simplemente lo siguiente:

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false
Comentarios (16)

indexOf tal vez, pero es una "extensión de JavaScript al estándar ECMA-262; como tal puede no estar presente en otras implementaciones del estándar".

Ejemplo:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS Microsoft no *ofrece algún tipo de alternativa a esto, pero se puede añadir una funcionalidad similar a las matrices en Internet Explorer (y otros navegadores que no soportan indexOf) si se quiere, como revela una búsqueda rápida en Google (por ejemplo, esta).

Comentarios (4)

Si estás usando JavaScript 1.6 o posterior (Firefox 1.5 o posterior) puedes usar Array.indexOf. De lo contrario, creo que va a terminar con algo similar a su código original.

Comentarios (0)