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.
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.
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
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.
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.
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);
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);
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);
Le code à une seule ligne .. retournera vrai ou faux
!!(arr.indexOf("val")+1)
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;
}
Vous pouvez utiliser la fonction _ contient de la bibliothèque underscore.js pour y parvenir:
if (_.contains(haystack, needle)) {
console.log("Needle found.");
};
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
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']
_
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