4946 votes

tableau.contient(obj) en JavaScript

Qu'est-ce que la plus concise et efficace pour savoir si un tableau JavaScript contient un obj?

C'est la seule façon que je sais faire:

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

Est-il mieux et de manière plus concise pour accomplir cette?

C'est très étroitement liée à Débordement de Pile question Meilleure façon de trouver un élément dans un Tableau JavaScript? qui traite de la recherche d'objets dans un tableau à l'aide d' indexOf.

5454voto

codeape Points 38576

Les navigateurs modernes ont Array#indexOf, ce qui est exactement ce que fait; c'est dans la nouvelle(ish) ECMAScript 5ème édition de la spécification, mais il a été dans plusieurs navigateurs depuis des années. Les navigateurs plus anciens peuvent être pris en charge en utilisant le code répertorié dans la "compatibilité" de la section au bas de cette page.

jQuery a une fonction d'utilité à cela:

$.inArray(value, array)

Il renvoie l'index d'une valeur dans un tableau. Elle renvoie -1 si le tableau ne contient pas la valeur.

jQuery a plusieurs utiles les fonctions de l'utilitaire.

Un excellent utilitaire de JavaScript bibliothèque underscore.js:

  • _.contains(list, value), alias _.include(list, value) (trait de soulignement de l'contient/include utilise indexOf en interne, si elle est adoptée un tableau JavaScript).

Certains autres cadres:

Remarquez comment certains cadres de mettre en œuvre la présente comme une fonction. Tandis que d'autres cadres d'ajouter la fonction de la matrice de prototype.

Les langues que les compiler en javascript

En coffeescript, l' in de l'opérateur est l'équivalent d' 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);

508voto

Damir Zekić Points 7517

Mise à jour: @orip mentionne dans les commentaires, liés test a été fait en 2008, les résultats peuvent ne pas être pertinents pour les navigateurs modernes. Cependant, vous avez probablement besoin de ce soutien non-navigateurs modernes de toute façon et ils n'ont probablement pas été mis à jour depuis. Toujours tester par vous-même.

Comme d'autres l'ont dit, l'itération à travers le tableau est probablement la meilleure façon, mais il a été prouvé qu'une baisse while boucle est le moyen le plus rapide pour effectuer une itération en JavaScript. De sorte que vous pouvez réécrire votre code comme suit:

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

Bien sûr, vous pouvez ainsi prolonger la Matrice de prototype:

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

Et maintenant vous pouvez simplement utiliser les éléments suivants:

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

250voto

cic Points 2225

indexOf peut-être, mais c'est un "JavaScript extension à la norme ECMA-262; comme telle, elle ne peut pas être présents dans d'autres implémentations de la norme."

Exemple:

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

AFAICS Microsoft n'est pas une sorte d'alternative à cela, mais vous pouvez ajouter des fonctionnalités similaires aux tableaux dans Internet Explorer (et les autres navigateurs qui ne supportent pas l' indexOf) si vous voulez, qu'une rapide recherche sur Google révèle (par exemple, cette une).

126voto

william malo Points 737

b est la valeur de a est la matrice de

Elle renvoie true ou false

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

87voto

Már Örlygsson Points 6861

Voici un Javascript 1.6 compatible mise en œuvre de la Matrice.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;
      };
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X