JavaScript está en la matriz

152

Digamos que tengo esto:

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

Hay más elementos de matriz, pero esos son solo algunos para fines de legibilidad. De todos modos, podría hacer un bucle "for", pero haría 500 bucles cada vez que haga clic en el mapa ... ¿hay alguna otra manera de ver si cierta cadena está en una matriz?

prueba
fuente

Respuestas:

247

Prueba esto:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}
Bala R
fuente
24
Esto no funciona para navegadores antiguos (como IE <9). Hay una función jQuery para esto: api.jquery.com/jQuery.inArray
Vinicius Pinto
55
Una forma más rápida es voltear el bit sabio, if(!!~blockedTile.indexOf('118))este método siempre devolverá verdadero si el resultado> -1 y falso si el resultado === -1
bm_i
11
@bm_i ¿Qué más rápido ? ¿Más rápido para escribir?
alex
1
indexOf()También se puede aplicar en matrices literales, por ejemplo if (-1 == [84, 116].indexOf(event.keyCode)). Probado en Chrome 37.0.2062.122.
François
2
fwiw siempre uso indexOf(…) >= 0. no hace ninguna diferencia y olvido dónde lo recogí como un hábito
JSDBroughton
49

Como se mencionó anteriormente, si su navegador es compatible indexOf(), ¡genial! De lo contrario, debe polifilarlo o confiar en un cinturón de servicios públicos como lodash / subrayado .

Solo quería agregar este nuevo ES2016 adición (para mantener esta pregunta actualizada):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}
Kutyel
fuente
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
}
ndhanhse
fuente
2
OP no quería un bucle
JNF
12

Use Underscore.js

Es compatible con varios navegadores y puede realizar una búsqueda binaria si sus datos están ordenados.

_.índice de

_.indexOf (matriz, valor, [isSorted]) Devuelve el índice en el que se puede encontrar el valor en la matriz, o -1 si el valor no está presente en la matriz. Utiliza la función indexOf nativa a menos que falte. Si está trabajando con una matriz grande, y sabe que la matriz ya está ordenada, pase true para isSorted para usar una búsqueda binaria más rápida.

Ejemplo

//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');   
}
Brandon Boone
fuente
11

Algunos navegadores son compatibles Array.indexOf() .

Si no, podría aumentar el Arrayobjeto a través de su prototipo de esta manera ...

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

Fuente .

alex
fuente
¿No podemos usar ('118' en BlockTile) en JavaScript?
prabhat mishra
1
@prabhatmishra Eso solo puede verificar las llaves.
alex
9

Solo use para su gusto:

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>

Сергей Савельев
fuente
6
if(array.indexOf("67") != -1) // is in array
Marty
fuente
6

La mejor manera de hacerlo en 2019 es usando .includes()

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

El primer parámetro es lo que estás buscando. El segundo parámetro es la posición del índice en esta matriz en la que comenzar a buscar.

Si necesita ser curioso aquí, hay muchas respuestas heredadas.

Alex debajo
fuente
1
La includessolución está duplicada en las respuestas de Kutyel (2016), Сергей Савельев (2017) y Krunal Limbad (2018) con ejemplos y referencias igualmente detallados ...
CPHPython
4

Ya respondí anteriormente pero quería compartir.

Sin embargo, no funcionará en IE. gracias por mencionarlo @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

Tengo alguna referencia aquí . También tienen Polyfill para arriba.

Krunal Limbad
fuente
Ten cuidado cuando uses esto. Array.includes()se presenta en ES7 (ECMAScript 2017) y no funcionará con navegadores antiguos. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
uxcode
3

Dependiendo de la versión de JavaScript que tenga disponible, puede usar indexOf:

Devuelve el primer índice en el que se puede encontrar un elemento determinado en la matriz, o -1 si no está presente.

O some:

Comprueba si algún elemento de la matriz supera la prueba implementada por la función proporcionada.

Pero, si está haciendo este tipo de verificación de existencia, sería mejor usar un objeto para almacenar sus cadenas (o tal vez un objeto, así como la matriz, dependiendo de lo que esté haciendo con sus datos).

mu es demasiado corto
fuente
3

Usaría una estructura de datos diferente, ya que la matriz parece no ser la mejor solución.

En lugar de matriz, use un objeto como una tabla hash, así:

(publicado también en 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");

Salida de consola:

x exists? - yes
a exists? - no

Esa es una solución directa. Si está más interesado en un enfoque orientado a objetos, busque en Google "js hashtable" .

Ron Klein
fuente
3

En mi humilde opinión, es más compatible con navegadores antiguos

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

Al convertir una copia de matriz en una cadena CSV, puede probar la cadena en navegadores más antiguos.

Mark Giblin
fuente
3
esto será falso positivo si alguno de los miembros de la matriz contenía la aguja pero no lo era exclusivamente. p.ej['Lemon Pie'].inArray('Lemon') , volveremos True. Puede envolver la aguja ,para evitarlo o usar la coincidencia de expresiones regulares para hacer lo mismo, pero sería preferible unir usando algo más oscuro que ,por razones similares de falsos positivos (por |ejemplo). Depende del conjunto de datos
JSDBroughton
1

¿Por qué no usas Array.filter?

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

Simplemente copie eso en su código, y aquí está:

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

en el ejemplo de matriz, es lo mismo 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"); 

    }
Avinash Raut
fuente
0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false
kaboome
fuente
44
Publicar un fragmento de código NO es una respuesta, debe agregar explicaciones además de eso.
xoxel
1
Si bien este fragmento de código puede resolver el problema, no explica por qué o cómo responde la pregunta. Por favor, incluya una explicación de su código , como que realmente ayuda a mejorar la calidad de su puesto. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código. Señaladores / revisores: para respuestas de solo código como esta, ¡voto negativo, no elimine!
Luca Kiebel
Ya hay varias respuestas que sugieren usar includes. ¿Cómo proporciona esta respuesta valores adicionales en comparación con ellos?
Boghyon Hoffmann
0

Puedes probar el siguiente código. Verifique 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'); }

compruebe arr.length si es mayor que 0 significa que la cadena está presente; de ​​lo contrario, no está presente.

Prasad Wargad
fuente
-2

Creo que la forma más simple es que:

(118 in blockedTile); //is true 
Cristian Mecozzi
fuente