830 votes

La meilleure façon de trouver un élément dans un tableau JavaScript?

Double Possible:
tableau.contient(obj) en JavaScript

Quelle est la meilleure façon de savoir si un objet est dans un tableau?

C'est le meilleur moyen que je connaisse:

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

include([1,2,3,4], 3); // true
include([1,2,3,4], 6); // undefined

764voto

Vinko Vrsalovic Points 116138
function include(arr,obj) {
    return (arr.indexOf(obj) != -1);
}

EDIT: Cela ne fonctionne pas sur IE6, 7 ou 8. La meilleure solution est de définir vous-même si il n'est pas présent:

  1. Mozilla est (ECMA-262) la version:

      if (!Array.prototype.indexOf)
      {
    
           Array.prototype.indexOf = function(searchElement /*, fromIndex */)
    
        {
    
    
        "use strict";
    
        if (this === void 0 || this === null)
          throw new TypeError();
    
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0)
          return -1;
    
        var n = 0;
        if (arguments.length > 0)
        {
          n = Number(arguments[1]);
          if (n !== n)
            n = 0;
          else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
            n = (n > 0 || -1) * Math.floor(Math.abs(n));
        }
    
        if (n >= len)
          return -1;
    
        var k = n >= 0
              ? n
              : Math.max(len - Math.abs(n), 0);
    
        for (; k < len; k++)
        {
          if (k in t && t[k] === searchElement)
            return k;
        }
        return -1;
      };
    
    }
    
  2. Daniel James's version:

    if (!Array.prototype.indexOf) {
      Array.prototype.indexOf = function (obj, fromIndex) {
        if (fromIndex == null) {
            fromIndex = 0;
        } else if (fromIndex < 0) {
            fromIndex = Math.max(0, this.length + fromIndex);
        }
        for (var i = fromIndex, j = this.length; i < j; i++) {
            if (this[i] === obj)
                return i;
        }
        return -1;
      };
    }
    
  3. roosteronacid's version:

    Array.prototype.hasObject = (
      !Array.indexOf ? function (o)
      {
        var l = this.length + 1;
        while (l -= 1)
        {
            if (this[l - 1] === o)
            {
                return true;
            }
        }
        return false;
      } : function (o)
      {
        return (this.indexOf(o) !== -1);
      }
    );
    

210voto

GerManson Points 3238

Si vous utilisez jQuery:

http://api.jquery.com/jQuery.inArray/

34voto

Daniel James Points 2889

Tout d'abord, mettre en oeuvre indexOf en JavaScript pour les navigateurs qui ne l'est pas déjà. Voir, par exemple, Erik Arvidsson du tableau extras (également, les associés blog post). Et puis vous pouvez utiliser indexOf sans vous soucier de la prise en charge du navigateur. Ici est un peu une version optimisée de son indexOf mise en œuvre:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (obj, fromIndex) {
        if (fromIndex == null) {
            fromIndex = 0;
        } else if (fromIndex < 0) {
            fromIndex = Math.max(0, this.length + fromIndex);
        }
        for (var i = fromIndex, j = this.length; i < j; i++) {
            if (this[i] === obj)
                return i;
        }
        return -1;
    };
}

Il a changé pour stocker la longueur de sorte qu'il n'a pas besoin de le chercher chaque itération. Mais la différence n'est pas énorme. Moins objectif général de la fonction pourrait être plus rapide:

var include = Array.prototype.indexOf ?
    function(arr, obj) { return arr.indexOf(obj) !== -1; } :
    function(arr, obj) {
        for(var i = -1, j = arr.length; ++i < j;)
            if(arr[i] === obj) return true;
        return false;
    };

Je préfère utiliser la fonction standard et en laissant ce genre de micro-optimisation pour quand c'est vraiment nécessaire. Mais si vous êtes désireux sur la micro-optimisation, j'ai adapté les critères de référence qui roosterononacid liés à la dans les commentaires, à l' indice de référence de la recherche dans des tableaux. Ils sont assez brut cependant, une enquête approfondie permettrait de tester des tableaux avec différents types, différentes longueurs et de trouver des objets qui se produisent dans des endroits différents.

13voto

assortedslog Points 81

Si le tableau est trié, il n'est pas vraiment une meilleure façon (à part en utilisant le mentionnés ci-dessus indexOf, qui, je pense, revient à la même chose). Si le tableau est trié, vous pouvez faire une recherche binaire, qui fonctionne comme ceci:

  1. Choisissez le moyen de l'élément de la matrice.
  2. C'est l'élément que vous recherchez plus grand que l'élément que vous avez choisi? Si oui, vous avez éliminé la moitié inférieure du tableau. Si ce n'est pas le cas, vous avez éliminé la moitié supérieure.
  3. Choisissez le moyen de l'élément de l'autre moitié du tableau, et vous continuez à l'étape 2, en éliminant les moitiés de le reste de la matrice. Éventuellement, vous allez trouver votre élément ou n'ont pas de tableau de gauche à regarder à travers.

Binaire de recherche fonctionne en temps proportionnel au logarithme de la longueur de la matrice, de sorte qu'il peut être beaucoup plus rapide que de le regarder chaque élément individuel.

10voto

adrian Points 339

en supposant que .indexOf() est mis en œuvre peuvent mettre en œuvre quelque chose de semblable à obj.hasOwnProperty(prop)

Object.defineProperty( Array.prototype,'has',
         {
            value:function(o){return this.indexOf(o)!=-1},
            // writable:false,
            // enumerable:false
         }
   )

maintenant, la nouvelle méthode peut être utilisée comme

[22 ,'a', {prop:'x'}].has(12) 

retourner false

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