JavaScript est dans le tableau


152

Disons que j'ai ceci:

var blockedTile = new Array("118", "67", "190", "43", "135", "520");

Il y a plus d'éléments de tableau, mais ce ne sont que quelques-uns pour des raisons de lisibilité. Quoi qu'il en soit, je pourrais faire une boucle "for" mais cela ferait 500 boucles à chaque fois que vous cliquez sur la carte ... y a-t-il un autre moyen de voir si une certaine chaîne est dans un tableau?

Réponses:


247

Essaye ça:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}

24
Cela ne fonctionne pas pour les anciens navigateurs (comme IE <9). Il existe une fonction jQuery pour cela: api.jquery.com/jQuery.inArray
Vinicius Pinto

5
Un moyen plus rapide est de retourner le bit par bit, if(!!~blockedTile.indexOf('118))cette méthode retournera toujours vrai si le résultat> -1 et faux si résultat === -1
bm_i

11
@bm_i Lequel le plus rapide ? Plus rapide à taper?
alex

1
indexOf()peut également être appliqué sur des tableaux littéraux, par exemple if (-1 == [84, 116].indexOf(event.keyCode)). Testé sur Chrome 37.0.2062.122.
François

2
fwiw j'utilise toujours indexOf(…) >= 0. ne fait aucune différence et j'oublie où je l'ai pris comme habitude
JSDBroughton

49

Comme mentionné précédemment, si votre navigateur prend en charge indexOf(), tant mieux! Sinon, vous devez le pollyfil ou vous fier à une ceinture utilitaire telle que lodash / underscore .

Je voulais juste ajouter ce nouvel ajout ES2016 (pour garder cette question à jour):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}

12
function in_array(needle, haystack){
    var found = 0;
    for (var i=0, len=haystack.length;i<len;i++) {
        if (haystack[i] == needle) return i;
            found++;
    }
    return -1;
}
if(in_array("118",array)!= -1){
//is in array
}

2
OP ne voulait pas de boucle
JNF

12

Utilisez Underscore.js

Il est compatible avec tous les navigateurs et peut effectuer une recherche binaire si vos données sont triées.

_.Indice de

_.indexOf (array, value, [isSorted]) Renvoie l'index auquel la valeur peut être trouvée dans le tableau, ou -1 si la valeur n'est pas présente dans le tableau. Utilise la fonction native indexOf sauf si elle est manquante. Si vous travaillez avec un grand tableau et que vous savez que le tableau est déjà trié, passez true pour isSorted pour utiliser une recherche binaire plus rapide.

Exemple

//Tell underscore your data is sorted (Binary Search)
if(_.indexOf(['2','3','4','5','6'], '4', true) != -1){
    alert('true');
}else{
    alert('false');   
}

//Unsorted data works to!
if(_.indexOf([2,3,6,9,5], 9) != -1){
    alert('true');
}else{
    alert('false');   
}

11

Certains navigateurs prennent en charge Array.indexOf() .

Sinon, vous pourriez augmenter l' Arrayobjet via son prototype comme ça ...

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) // shortcut for verifying if it's NaN
        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;
  };
}

Source .


ne pouvons-nous pas utiliser ('118' dans BlockTile) en javascript?
prabhat mishra

1
@prabhatmishra Cela ne peut vérifier que les clés.
alex

9

Utilisez simplement à votre goût:

var blockedTile = [118, 67, 190, 43, 135, 520];

// includes (js)

if ( blockedTile.includes(118) ){
    console.log('Found with "includes"');
}

// indexOf (js)

if ( blockedTile.indexOf(67) !== -1 ){
    console.log('Found with "indexOf"');
}

// _.indexOf (Underscore library)

if ( _.indexOf(blockedTile, 43, true) ){
    console.log('Found with Underscore library "_.indexOf"');
}

// $.inArray (jQuery library)

if ( $.inArray(190, blockedTile) !== -1 ){
    console.log('Found with jQuery library "$.inArray"');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


7

La meilleure façon de le faire en 2019 est d'utiliser .includes()

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

Le premier paramètre est ce que vous recherchez. Le deuxième paramètre est la position d'index dans ce tableau à partir de laquelle commencer la recherche.

Si vous avez besoin d'être croisé ici, il existe de nombreuses réponses héritées.


1
La includessolution est dupliquée dans les réponses Kutyel (2016), Сергей Савельев (2017) et Krunal Limbad (2018) avec des exemples et des références tout aussi détaillés ...
CPHPython

6
if(array.indexOf("67") != -1) // is in array

4

Déjà répondu ci-dessus mais je voulais partager.

Ne fonctionnera pas dans IE cependant. merci de l'avoir mentionné @Mahmoud

var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

obtenu une référence ici . ils ont également Polyfill pour ci-dessus.


Soyez prudent lorsque vous l'utilisez. Array.includes()est introduit dans ES7 (ECMAScript 2017) et ne fonctionnera pas avec les anciens navigateurs. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
uxcode

3

Selon la version de JavaScript dont vous disposez, vous pouvez utiliser indexOf:

Renvoie le premier index auquel un élément donné peut être trouvé dans le tableau, ou -1 s'il n'est pas présent.

Ou some:

Teste si un élément du tableau réussit le test implémenté par la fonction fournie.

Mais, si vous faites beaucoup ce genre de vérification d'existence, vous feriez mieux d'utiliser un objet pour stocker vos chaînes (ou peut-être un objet ainsi que le tableau en fonction de ce que vous faites avec vos données).


3

J'utiliserais une structure de données différente, car le tableau ne semble pas être la meilleure solution.

Au lieu d'un tableau, utilisez un objet comme table de hachage, comme ceci:

(posté aussi dans jsbin )

var arr = ["x", "y", "z"];
var map = {};
for (var k=0; k < arr.length; ++k) {
  map[arr[k]] = true;
}

function is_in_map(key) {
  try {
    return map[key] === true;
  } catch (e) {
    return false;
  }
}


function print_check(key) {
  console.log(key + " exists? - " + (is_in_map(key) ? "yes" : "no"));
}

print_check("x");
print_check("a");

Sortie de la console:

x exists? - yes
a exists? - no

C'est une solution simple. Si vous préférez une approche orientée objet, recherchez "js hashtable" sur Google .


3

IMHO le plus compatible avec les navigateurs plus anciens

Array.prototype.inArray = function( needle ){

    return Array(this).join(",").indexOf(needle) >-1;

}

var foods = ["Cheese","Onion","Pickle","Ham"];
test = foods.inArray("Lemon");
console.log( "Lemon is " + (test ? "" : "not ") + "in the list." );

En transformant une copie de tableau en une chaîne CSV, vous pouvez tester la chaîne dans les navigateurs plus anciens.


3
cela sera faux positif si l'un des membres du tableau contenait l'aiguille mais ne l'était pas exclusivement. par exemple ['Lemon Pie'].inArray('Lemon')reviendra True. Vous pouvez envelopper l'aiguille avec ,pour le contourner ou utiliser la correspondance regex pour faire de même, mais la jointure serait préférable en utilisant quelque chose de plus obscur que ,pour des raisons faussement positives similaires (par |exemple). Cela dépend du jeu de données
JSDBroughton

1

Pourquoi n'utilisez-vous pas Array.filter?

var array = ['x','y','z'];
array.filter(function(item,index,array){return(item==YOURVAL)}).

Copiez simplement cela dans votre code, et c'est parti:

Array.prototype.inArray = function (searchedVal) {
return this.filter(function(item,index,array){return(item==searchedVal)}).length==true
}

0

dans l'exemple de tableau, c'est la même chose en php (in_array)

 var ur_fit = ["slim_fit", "tailored", "comfort"];
 var ur_length = ["length_short", "length_regular", "length_high"];
    if(ur_fit.indexOf(data_this)!=-1){
        alert("Value is avail in ur_fit array");
    }
    else if(ur_length.indexOf(data_this)!=-1){      
         alert("value is avail in ur_legth array"); 

    }

0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false

4
Publier un morceau de code n'est PAS une réponse, vous devez ajouter des explications en plus.
xoxel

1
Bien que cet extrait de code puisse résoudre le problème, il n'explique pas pourquoi ni comment il répond à la question. Veuillez inclure une explication de votre code , car cela contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Flaggers / reviewers: pour les réponses de code uniquement comme celle-ci, votez contre, ne supprimez pas!
Luca Kiebel

Il y a déjà plusieurs réponses suggérant d'utiliser includes. Comment cette réponse fournit-elle des valeurs supplémentaires par rapport à elles?
Boghyon Hoffmann

0

Vous pouvez essayer le code ci-dessous. Vérifiez http://api.jquery.com/jquery.grep/

var blockedTile = new Array("118", "67", "190", "43", "135", "520");
var searchNumber = "11878";
arr = jQuery.grep(blockedTile, function( i ) {
  return i === searchNumber;
});
if(arr.length){ console.log('Present'); }else{ console.log('Not Present'); }

vérifiez arr.length si elle est supérieure à 0 signifie que la chaîne est présente sinon elle n'est pas présente.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.