web-dev-qa-db-fra.com

Vérifier si un élément est présent dans un tableau

La fonction que j'utilise maintenant pour vérifier ceci est la suivante:

function inArray(needle,haystack)
{
    var count=haystack.length;
    for(var i=0;i<count;i++)
    {
        if(haystack[i]===needle){return true;}
    }
    return false;
}

Ça marche. Ce que je recherche, c'est s'il existe un meilleur moyen de le faire.

482
Francisc

ECMAScript 2016 incorpore une méthode includes() pour les tableaux qui résolvent spécifiquement le problème, qui est désormais la méthode préférée.

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(1, 2);  // false (second parameter is the index position in this array at which to begin searching)

À compter de JUILLET 2018, ceci a été mis en œuvre dans presque tous les navigateurs principaux , si vous en avez besoin pour supporter IE a polyfill est disponible.

846
Alister

Code:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}

Exécution:

isInArray(1, [1,2,3]); // true

Mise à jour (2017):

Dans les navigateurs modernes qui respectent la norme ECMAScript 2016 (ES7), vous pouvez utiliser la fonction Array.prototype.includes , ce qui facilite grandement la vérification de la présence d'un élément dans un tableau:

const array = [1, 2, 3];
const value = 1;
const isInArray = array.includes(value);
console.log(isInArray); // true
404
Benny Neugebauer

Il suffit d'utiliser indexOf :

haystack.indexOf(needle) >= 0

Si vous souhaitez prendre en charge les anciens Internet Explorers (<IE9), vous devrez inclure votre code actuel comme solution de contournement .

À moins que votre liste ne soit triée, vous devez comparer chaque valeur à l'aiguille. Par conséquent, votre solution et indexOf devront exécuter en moyenne n/2 comparaisons. Cependant, étant donné que indexOf est une méthode intégrée, elle peut utiliser des optimisations supplémentaires et sera légèrement plus rapide en pratique. Notez que, sauf si votre application effectue une recherche extrêmement fréquente dans les listes (disons 1000 fois par seconde) ou si les listes sont énormes (disons 100 000 entrées), la différence de vitesse n'aura pas d'importance.

76
phihag

Je l'ai référencé plusieurs fois sur Google Chrome 52, mais n'hésitez pas à le copier dans la console de tout autre navigateur.


~ 1500 ms, comprend (~ 2700 ms lorsque j'ai utilisé le polyfill )

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(array.includes("test") === true){ result++; }
}
console.log(new Date().getTime() - start);

~ 1050 ms, indexOf

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(array.indexOf("test") > -1){ result++; }
}
console.log(new Date().getTime() - start);

~ 650 ms, fonction personnalisée

function inArray(target, array)
{

/* Caching array.length doesn't increase the performance of the for loop on V8 (and probably on most of other major engines) */

  for(var i = 0; i < array.length; i++) 
  {
    if(array[i] === target)
    {
      return true;
    }
  }

  return false; 
}

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(inArray("test", array) === true){ result++; }
}
console.log(new Date().getTime() - start);
33

Le code à une seule ligne .. retournera vrai ou faux

!!(arr.indexOf("val")+1)
22
Akarsh Satija

Vous pouvez utiliser indexOf mais cela ne fonctionne pas bien dans la dernière version d'Internet Explorer. Code:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}

Exécution:

isInArray(1, [1,2,3]); // true

Je vous suggère d'utiliser le code suivant:

function inArray(needle, haystack) {
 var length = haystack.length;
 for (var i = 0; i < length; i++) {
 if (haystack[i] == needle)
  return true;
 }
 return false;
}
15
user2598812

Vous pouvez utiliser la fonction _ contient de la bibliothèque underscore.js pour y parvenir:

if (_.contains(haystack, needle)) {
  console.log("Needle found.");
};
8
Chris Alley

Depuis ECMAScript6, on peut utiliser Set:

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
4
Nicolas

En fonction de la taille de l'aiguille que vous recherchez, le Array.filter peut être utile. Voici un exemple:

_let filtered, arr = ['Haystack', 'Needle'];
filtered = arr.filter((elem) => {
  return elem.toLowerCase() === 'needle';
});
// filtered => ['needle']
_
2
Josh Habdas

Dans lodash, vous pouvez utiliser _. Includes (qui aliases également avec _.contains)

Vous pouvez rechercher tout le tableau:

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

Vous pouvez rechercher le tableau à partir d'un index de départ:

_.includes([1, 2, 3], 1, 1);  // false (begins search at index 1)

Rechercher une chaîne:

_.includes('pebbles', 'eb');  // true (string contains eb)

Fonctionne également pour vérifier des tableaux simples d'objets:

_.includes({ 'user': 'fred', 'age': 40 }, 'fred');    // true
_.includes({ 'user': 'fred', 'age': false }, false);  // true

Une chose à noter concernant le dernier cas est que cela fonctionne pour les primitives telles que les chaînes, les nombres et les booléens, mais ne peut pas effectuer de recherche dans des tableaux ou des objets.

_.includes({ 'user': 'fred', 'age': {} }, {});   // false
_.includes({ 'user': [1,2,3], 'age': {} }, 3);   // false
0
Connor Leech