jQuery / Método / jQuery.inArray() - Encontrar corretamente um índice de array

jQuery.inArray(value, array, fromIndex) devolve o primeiro índice correspondente ou -1 se não encontrar. Teste presença com index !== -1. Zero significa encontrado no começo; usar o retorno diretamente em um if pode dar a resposta errada.

O retorno é uma posição, não um booleano

A API jQuery.inArray() recebe valor, array e índice inicial opcional nessa ordem. É uma utilidade global chamada $.inArray(...) ou jQuery.inArray(...), não um método da seleção DOM como $(selector).inArray(...).

Retorno Significado Boolean(index) index !== -1
0 Encontrado na primeira entrada false true
Inteiro a partir de 1 Encontrado naquele índice true true
-1 Não encontrado no intervalo true false

if (index) e index > 0 ignoram a primeira entrada. JavaScript considera -1 verdadeiro em condições, então apenas negar também não resolve. Compare explicitamente com -1 ou confira se é pelo menos zero.

Exemplo completo variando tipo e início

Salve todo o código em UTF-8 como inarray-demo.html e abra no navegador. É preciso internet para carregar o arquivo oficial do jQuery 4.0.0 pela rede de distribuição de conteúdo, CDN, sem instalar pacotes. Tipos, inícios positivos/negativos, array vazio e comparação foram executados com 3.7.1 e 4.0.0.

O array é [0, "0", "alpha", 0]. Value vem de opções predefinidas sem avaliar expressões de strings. Apenas From index é convertido por Number() em posição inicial.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Search an array with inArray</title>
  <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
  <style>
    body { font: 16px/1.6 sans-serif; max-width: 760px; margin: 24px auto; padding: 16px; }
    button, select { font: inherit; margin: 4px; }
    pre { white-space: pre-wrap; overflow-wrap: anywhere; }
  </style>
</head>
<body>
  <h1>Find an index rather than a boolean</h1>
  <p>Array: [0, "0", "alpha", 0]</p>
  <label for="value">Value:</label>
  <select id="value"><option value="number">0 (number)</option><option value="string">0 (string)</option><option value="alpha">alpha</option><option value="missing">missing</option></select>
  <label for="from">From index:</label>
  <select id="from"><option>0</option><option>1</option><option>3</option><option>9</option><option>-1</option></select>
  <button type="button" id="search">Search</button>
  <button type="button" id="reset">Reset</button>
  <pre id="result" aria-live="polite"></pre>
  <script>
    $(function () {
      const array = [0, "0", "alpha", 0];
      const choices = { number: 0, string: "0", alpha: "alpha", missing: "missing" };
      function search() {
        const value = choices[$("#value").val()];
        const fromIndex = Number($("#from").val());
        const index = $.inArray(value, array, fromIndex);
        const found = index !== -1;
        $("#result").text(`value=${JSON.stringify(value)} (${typeof value})\nindex=${index}\nfound=${found}\nBoolean(index)=${Boolean(index)}`);
      }
      $("#value, #from").on("change", search);
      $("#search").on("click", search);
      $("#reset").on("click", function () {
        $("#value").val("number");
        $("#from").val("0");
        search();
      });
      search();
    });
  </script>
</body>
</html>

Inicialmente o número zero é encontrado no começo:

value=0 (number)
index=0
found=true
Boolean(index)=false
  1. 0 (string) retorna índice 1: número 0 e string "0" diferem.
  2. Volte a 0 (number) e escolha From index 1: retorna 3, pulando o zero numérico anterior.
  3. 3 também retorna 3 porque inclui a posição inicial.
  4. 9 excede o comprimento: índice -1 e found false, embora Boolean(index) continue true.
  5. -1 começa na última posição, índice 3, encontrando zero numérico.
  6. Com início 0, alpha e missing dão 2 e -1. Reset restaura zero numérico e início zero; Search repete as condições atuais.

Comparação estrita e limites de fromIndex

A comparação é estrita, como ===. "0" não vira número 0 automaticamente e substrings não coincidem. Defina o tipo desejado das entradas, conversões aceitas e tratamento de falhas.

Sem início é usado zero. Um início negativo é calculado do final, mas a busca continua para a frente. Muito antes do array começa em zero; a partir do comprimento devolve -1. O resultado é índice absoluto, não relativo ao início. Duplicatas dão somente a primeira ocorrência a partir daquela posição.

Objetos são comparados por referência, não por propriedades semelhantes. Execute este trecho completo no Console das ferramentas de desenvolvimento para comparar o mesmo objeto, um novo, NaN e alternativas nativas.

const item = { id: 1 };
console.log(`same object=${$.inArray(item, [item])}`);
console.log(`new object=${$.inArray({ id: 1 }, [item])}`);
console.log(`NaN index=${$.inArray(NaN, [NaN])} | includes=${[NaN].includes(NaN)}`);
console.log(`empty=${$.inArray("a", [])}`);
const array = ["a", "b", "a"];
console.log(`start 1=${$.inArray("a", array, 1)} | start -1=${$.inArray("a", array, -1)}`);
console.log(`native index=${array.indexOf("a", 1)} | native found=${array.includes("a", 1)}`);
same object=0
new object=-1
NaN index=-1 | includes=true
empty=-1
start 1=2 | start -1=2
native index=2 | native found=true

Escolher indexOf ou includes e proteger a sequência

Para posições em arrays comuns, use também array.indexOf(value, fromIndex) nativo. Não é preciso adicionar jQuery a um projeto só por uma busca. A chamada é array.indexOf(value), em vez de $.inArray(value, array).

Para apenas presença, array.includes(value, fromIndex) retorna true ou false. As regras não são idênticas: NaN dá -1 com $.inArray() e indexOf(), mas true com includes(). Referências de objetos e distinção número/string continuam importantes.

Verifique -1 antes de usar o resultado para excluir. Passar uma falha diretamente a splice() pode remover a última entrada. Se o resultado diferir, confira tipos, ordem dos argumentos, início, referências e alterações do array original.