JavaScript está na matriz

152

Digamos que eu tenho isso:

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

Há mais elementos de matriz, mas esses são apenas alguns para fins de legibilidade. Enfim, eu poderia fazer um loop "for", mas ele faria 500 loops toda vez que você clicar no mapa ... existe alguma outra maneira de ver se uma determinada string está em uma matriz?

teste
fonte

Respostas:

247

Tente o seguinte:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}
Bala R
fonte
24
Isso não funciona para navegadores antigos (como o IE <9). Existe uma função jQuery para isso: api.jquery.com/jQuery.inArray
Vinicius Pinto
5
A maneira mais rápida é para virar a pouco sábio if(!!~blockedTile.indexOf('118))este método sempre retornará verdadeiro se o resultado> -1 e falso se o resultado === -1
bm_i
11
@bm_i Qual mais rápido ? Mais rápido para digitar?
alex
1
indexOf()também pode ser aplicado em matrizes literais, por exemplo if (-1 == [84, 116].indexOf(event.keyCode)). Testado no Chrome 37.0.2062.122.
François
2
Eu sempre uso indexOf(…) >= 0. não faz diferença e eu esquecer de onde eu peguei como um hábito
JSDBroughton
49

Como mencionado anteriormente, se o seu navegador suportar indexOf(), ótimo! Caso contrário, é necessário filtrá-lo ou contar com um cinto de utilidades como lodash / sublinhado .

Só queria adicionar esta adição mais recente do ES2016 (para manter esta pergunta atualizada):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}
Kutyel
fonte
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
fonte
2
OP não queria um loop
JNF
12

Use Underscore.js

É compatível com vários navegadores e pode executar uma pesquisa binária se seus dados forem classificados.

_.índice de

_.indexOf (matriz, valor, [isSorted]) Retorna o índice no qual o valor pode ser encontrado na matriz ou -1 se o valor não estiver presente na matriz. Usa a função indexOf nativa, a menos que esteja ausente. Se você estiver trabalhando com uma matriz grande e souber que a matriz já está classificada, passe true para isSorted para usar uma pesquisa binária mais rápida.

Exemplo

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

Alguns navegadores suportam Array.indexOf().

Caso contrário, você pode aumentar o Arrayobjeto através de seu protótipo da seguinte maneira ...

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 .

alex
fonte
não podemos usar ('118' em BlockedTile) em javascript?
Mishra prabhat
1
@prabhatmishra Isso só pode verificar as chaves.
alex
9

Basta usar para o seu gosto:

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>

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

A melhor maneira de fazer isso em 2019 é usando .includes()

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

O primeiro parâmetro é o que você está procurando. O segundo parâmetro é a posição do índice nessa matriz na qual iniciar a pesquisa.

Se você precisa ser inteligente aqui - há muitas respostas herdadas.

Alex Under
fonte
1
A includessolução é duplicado na Kutyel (2016), Сергей Савельев (2017) e Krunal Limbad (2018) respostas com exemplos igualmente detalhados e referências ...
CPHPython
4

Já respondeu acima, mas queria compartilhar.

Não vai funcionar no IE embora. obrigado por mencionar @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

tem alguma referência aqui . eles também têm Polyfill para acima.

Krunal Limbad
fonte
Tenha cuidado ao usar isso. Array.includes()é introduzido no ES7 (ECMAScript 2017) e não funcionará com navegadores antigos. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
uxcode
3

Dependendo da versão do JavaScript disponível, você pode usar indexOf:

Retorna o primeiro índice no qual um determinado elemento pode ser encontrado na matriz ou -1 se não estiver presente.

Ou some:

Testa se algum elemento da matriz passa no teste implementado pela função fornecida.

Mas, se você estiver fazendo esse tipo de existência, verifique muito, seria melhor usar um Objeto para armazenar suas seqüências de caracteres (ou talvez um objeto e a Matriz, dependendo do que está fazendo com seus dados).

mu é muito curto
fonte
3

Eu usaria uma estrutura de dados diferente, pois o array parece não ser a melhor solução.

Em vez de matriz, use um objeto como uma tabela de hash, assim:

(publicado também em 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");

Saída do console:

x exists? - yes
a exists? - no

Essa é uma solução direta. Se você prefere uma abordagem orientada a objetos, pesquise no Google "js hashtable" .

Ron Klein
fonte
3

IMHO mais compatível com navegadores antigos

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

Ao transformar uma cópia de matriz em uma sequência CSV, você pode testar a sequência em navegadores mais antigos.

Mark Giblin
fonte
3
isso será falso positivo se algum dos membros da matriz contiver a agulha, mas não a for exclusivamente. por exemplo ['Lemon Pie'].inArray('Lemon'), retornará True. Você pode enrolar a agulha ,para contorná-la ou usar a correspondência de expressões regulares para fazer o mesmo, mas a junção seria preferível usando algo mais obscuro do que ,por razões falso-positivas semelhantes (por |exemplo). Depende do conjunto de dados
JSDBroughton 8/16/16
1

Por que você não usa o Array.filter?

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

Basta copiar isso no seu código e aqui está:

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

no exemplo de array, é o mesmo no 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
fonte
0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false
kaboome
fonte
4
A publicação de um trecho de código NÃO é uma resposta; você deve adicionar explicações.
Xoxel
1
Embora esse trecho de código possa resolver o problema, ele não explica por que ou como responde à pergunta. Por favor incluir uma explicação para o seu código , como o que realmente ajuda a melhorar a qualidade do seu post. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código. Sinalizadores / revisores: para respostas somente de código como esta, com voto negativo, não exclua!
Luca Kiebel
Já existem várias respostas sugerindo o uso includes. Como essa resposta fornece valores adicionais em comparação a eles?
Boghyon Hoffmann
0

Você pode tentar o código abaixo. 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'); }

verifique arr.length se for maior que 0 significa que a string está presente; caso contrário, não está presente.

Prasad Wargad
fonte
-2

Eu acho que a maneira mais simples é que:

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