4257 votos

array.contains(obj) en JavaScript

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

Esta es la única manera que saben hacerlo:

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

Es la mejor y manera más concisa para lograr esto?

Esto está muy estrechamente relacionado con Stack Overflow pregunta Mejor manera de encontrar un elemento en un Array de JavaScript? que las direcciones de búsqueda de objetos en un array usando indexOf.

4691voto

codeape Puntos 38576

Los navegadores modernos tienen Array#indexOf, que hace exactamente lo que esta en el nuevo(ish) ECMAScript 5 ª edición de la especificación, pero ha sido en varios navegadores para años. Los navegadores más antiguos pueden ser compatibles con el código que aparece en la "compatibilidad" en la parte inferior de la página.

jQuery tiene una función de utilidad para esto:

$.inArray(value, array)

Devuelve el índice de un valor en una matriz. Devuelve -1 si el array no contiene el valor.

jQuery tiene varios útiles funciones de utilidad.

Una excelente utilidad JavaScript library es underscore.js:

  • _.contains(list, value), alias _.include(list, value) (subrayado contiene/incluyen los usos indexOf internamente si se pasa un array de JavaScript).

Algunos otros marcos:

Observa cómo algunos de los marcos de implementar esta función. Mientras que otros marcos de agregar la función a la matriz de prototipo.

Idiomas que compila a javascript

En coffeescript, la in operador es el equivalente a contains:

a = [1, 2, 3, 4]
alert(2 in a)

Dart:

var mylist = [1, 2, 3];
assert(mylist.contains(1));
assert(mylist.indexOf(1) == 0);

455voto

Damir Zekić Puntos 7517

Actualización: Como @orip menciona en los comentarios, los enlaces de referencia fue realizada en el 2008, por lo que los resultados pueden no ser relevantes para los navegadores modernos. Sin embargo, es probable que necesite este apoyo no de los navegadores modernos de todos modos y que probablemente no ha sido actualizado desde entonces. Siempre prueba por ti mismo.

Como otros han dicho, la iteración a través de la matriz es probablemente la mejor manera, pero se ha demostrado que una disminución del while bucle es la forma más rápida para recorrer en JavaScript. Si lo desea, puede volver a escribir el código como sigue:

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

Por supuesto, usted puede también ampliar la Matriz de prototipo:

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

Y ahora usted puede utilizar simplemente la siguiente:

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

220voto

cic Puntos 2225

indexOf tal vez, pero es una "extensión de JavaScript para la ECMA-262 estándar; por lo que puede no estar presente en otras implementaciones de la norma."

Ejemplo:

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

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

117voto

william malo Puntos 737

b es el valor de a es la matriz de

Devuelve true o false

   function(a,b){return!!~a.indexOf(b)}

83voto

Már Örlygsson Puntos 6861

He aquí un Javascript 1.6 compatible con la aplicación de Array.indexOf:

if (!Array.indexOf)
{
  Array.indexOf = [].indexOf ?
      function (arr, obj, from) { return arr.indexOf(obj, from); }:
      function (arr, obj, from) { // (for IE6)
        var l = arr.length,
            i = from ? parseInt( (1*from) + (from<0 ? l:0), 10) : 0;
        i = i<0 ? 0 : i;
        for (; i<l; i++) {
          if (i in arr  &&  arr[i] === obj) { return i; }
        }
        return -1;
      };
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X