Question Comment puis-je vérifier si un tableau inclut un objet dans JavaScript?


Quel est le moyen le plus concis et efficace pour savoir si un tableau JavaScript contient un objet?

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

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

Existe-t-il un moyen meilleur et plus concis d'accomplir cela?

Ceci est très étroitement lié à la question Stack Overflow La meilleure façon de trouver un article dans un tableau JavaScript? qui adresse la recherche d'objets dans un tableau en utilisant indexOf.


3217
2017-10-25 22:14


origine


Réponses:


Les navigateurs actuels ont Array#includes, qui fait exactement cette, est largement supportéet a un polyfill pour les navigateurs plus anciens.

> ['joe', 'jane', 'mary'].includes('jane');
true 

Vous pouvez aussi utiliser Array#indexOf, ce qui est moins direct, mais ne nécessite pas de Polyfills pour les navigateurs périmés.

Offres jQuery $.inArray, qui est fonctionnellement équivalent à Array#indexOf.

underscore.js, une bibliothèque d'utilitaires JavaScript, propose _.contains(list, value), alias _.include(list, value), qui utilisent tous les deux Indice de en interne si passé un tableau JavaScript.

Certains autres cadres offrent des méthodes similaires:

Notez que certains frameworks implémentent cela en tant que fonction, alors que d'autres ajoutent la fonction au prototype de tableau.


3644
2017-10-25 23:10



Mise à jour: Comme l'indique @orip dans les commentaires, le benchmark lié a été réalisé en 2008, les résultats peuvent ne pas être pertinents pour les navigateurs modernes. Cependant, vous avez probablement besoin de cela pour supporter les navigateurs non-modernes de toute façon et ils n'ont probablement pas été mis à jour depuis. Toujours tester pour vous-même.

Comme d'autres l'ont dit, l'itération à travers le tableau est probablement le meilleur moyen, mais il a été prouvé qu'une diminution while loop est le moyen le plus rapide d'itérer en JavaScript. Vous pouvez donc 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 aussi bien étendre le prototype Array:

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 ce qui suit:

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

357
2017-10-25 22:49



indexOf peut-être, mais c'est une "extension JavaScript à la norme ECMA-262, en tant que telle, il peut ne pas être présent 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 fait ne pas offrir une sorte d'alternative à cela, mais vous pouvez ajouter des fonctionnalités similaires à des tableaux dans Internet Explorer (et d'autres navigateurs qui ne prennent pas en charge indexOf) si vous le souhaitez, en tant que recherche rapide de Google révèle (par exemple, celui-là).


156
2018-01-01 01:40



ECMAScript 7 introduit Array.prototype.includes.

Il peut être utilisé comme ceci:

[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false

Il accepte également un deuxième argument facultatif fromIndex:

[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true

contrairement à indexOf, qui utilise Comparaison stricte de l'égalité, includes compare en utilisant SameValueZero algorithme d'égalité. Cela signifie que vous pouvez détecter si un tableau inclut un NaN:

[1, 2, NaN].includes(NaN); // true

Aussi différent de indexOf, includes ne saute pas les indices manquants:

new Array(5).includes(undefined); // true

Actuellement c'est encore un brouillon mais peut être polyfilledpour le faire fonctionner sur tous les navigateurs.


128
2018-03-24 04:59



b est la valeur, et a est le tableau. Ça revient true ou false:

function(a, b) {
    return a.indexOf(b) != -1
}

96
2017-10-27 00:38



Voici un JavaScript 1.6 compatible implémentation 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;
      };
}

65
2017-09-13 17:32



Utilisation:

function isInArray(array, search)
{
    return array.indexOf(search) >= 0;
}

// Usage
if(isInArray(my_array, "my_value"))
{
    //...
}

46
2017-08-27 16:45