JavaScript è in array


152

Diciamo che ho questo:

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

Ci sono più elementi dell'array, ma questi sono solo pochi per motivi di leggibilità. Ad ogni modo, potrei fare un ciclo "for" ma farebbe 500 loop ogni volta che fai clic sulla mappa ... c'è un altro modo per vedere se una certa stringa è in un array?

Risposte:


247

Prova questo:

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

24
Questo non funziona con i vecchi browser (come IE <9). C'è una funzione jQuery per questo: api.jquery.com/jQuery.inArray
Vinicius Pinto

5
Un modo più veloce è quello di capovolgere il bit saggio if(!!~blockedTile.indexOf('118))questo metodo restituirà sempre vero se il risultato> -1 e falso se risultato === -1
bm_i

11
@bm_i Quale più veloce ? Più veloce da digitare?
alex,

1
indexOf()può essere applicato anche su array letterali, ad es if (-1 == [84, 116].indexOf(event.keyCode)). Testato su Chrome 37.0.2062.122.
François,

2
ho sempre usato indexOf(…) >= 0. non fa alcuna differenza e dimentico dove l'ho preso come un'abitudine
JSDBroughton

49

Come accennato in precedenza, se il tuo browser supporta indexOf(), fantastico! In caso contrario, è necessario pollyfil o fare affidamento su una cintura di utilità come lodash / underscore .

Volevo solo aggiungere questa nuova aggiunta ES2016 (per mantenere aggiornata questa domanda):

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
L'OP non voleva un giro
JNF il

12

Usa Underscore.js

È compatibile con più browser e può eseguire una ricerca binaria se i dati sono ordinati.

_.indice di

_.indexOf (array, value, [isSorted]) Restituisce l'indice in corrispondenza del quale è possibile trovare il valore nell'array o -1 se il valore non è presente nell'array. Utilizza la funzione indexOf nativa a meno che non sia mancante. Se stai lavorando con un array di grandi dimensioni e sai che l'array è già ordinato, passa true per isSorted per utilizzare una ricerca binaria più veloce.

Esempio

//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

Alcuni browser supportano Array.indexOf() .

Altrimenti, potresti aumentare l' Arrayoggetto tramite il suo prototipo in questo modo ...

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;
  };
}

Fonte .


non possiamo usare ('118' in BlockTile) in JavaScript?
prabhat mishra,

1
@prabhatmishra Che può solo controllare le chiavi.
alex

9

Usa solo per i tuoi gusti:

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

Il modo migliore per farlo nel 2019 è usando .includes()

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

Il primo parametro è quello che stai cercando. Il secondo parametro è la posizione dell'indice in questo array da cui iniziare la ricerca.

Se hai bisogno di essere arrabbiato qui - ci sono molte risposte legacy.


1
La includessoluzione è duplicata nelle risposte di Kutyel (2016), Сергей Савельев (2017) e Krunal Limbad (2018) con esempi e riferimenti ugualmente dettagliati ...
CPHPython,

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

4

Ho già risposto sopra ma volevo condividere.

Tuttavia, non funzionerà in IE. grazie per averlo menzionato @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

ottenuto qualche riferimento qui . hanno anche Polyfill per sopra.


Fai attenzione quando lo usi. Array.includes()è stato introdotto in ES7 (ECMAScript 2017) e non funzionerà con i vecchi browser. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
uxcode

3

A seconda della versione di JavaScript disponibile, è possibile utilizzare indexOf:

Restituisce il primo indice in cui è possibile trovare un determinato elemento nella matrice o -1 se non è presente.

Oppure some:

Verifica se qualche elemento dell'array supera il test implementato dalla funzione fornita.

Ma, se stai facendo questo tipo di esistenza, controlla molto che sarebbe meglio usare un oggetto per archiviare le tue stringhe (o forse un oggetto e l'array a seconda di cosa stai facendo con i tuoi dati).


3

Userei una diversa struttura di dati, poiché l'array sembra non essere la soluzione migliore.

Invece di array, usa un oggetto come una tabella hash, in questo modo:

(pubblicato anche in 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");

Uscita console:

x exists? - yes
a exists? - no

Questa è una soluzione semplice. Se preferisci un approccio orientato agli oggetti, cerca "js hashtable" su Google .


3

IMHO più compatibile con i browser più vecchi

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." );

Trasformando una copia dell'array in una stringa CSV, è possibile testare la stringa nei browser meno recenti.


3
questo sarà falso positivo se uno qualsiasi dei membri dell'array contenesse l'ago ma non lo fosse esclusivamente. ad es . ['Lemon Pie'].inArray('Lemon')tornerà True. Puoi avvolgere l'ago ,per aggirarlo o usare la regex matching per fare lo stesso, ma unire sarebbe preferibile usare qualcosa di più oscuro che ,per simili ragioni di falsi positivi ( |diciamo). Dipende dal set di dati
JSDBroughton

1

Perché non usi Array.filter?

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

Basta copiarlo nel tuo codice, ed ecco fatto:

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

0

nell'esempio dell'array, lo stesso in 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
Pubblicare un pezzo di codice NON è una risposta, dovresti aggiungere delle spiegazioni.
xoxel,

1
Sebbene questo frammento di codice possa risolvere il problema, non spiega perché o come risponde alla domanda. Includi una spiegazione per il tuo codice , in quanto ciò aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Flaggers / recensori: per le risposte di solo codice come questo, downvote, non eliminare!
Luca Kiebel,

Esistono già diverse risposte che suggeriscono di utilizzare includes. In che modo questa risposta fornisce valori aggiuntivi rispetto a loro?
Boghyon Hoffmann,

0

Puoi provare sotto il codice. Controlla 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'); }

controlla arr.length se è più di 0 significa che la stringa è presente altrimenti non è presente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.