jQuery / Método / jQuery.inArray() - Buscar correctamente un índice de array

jQuery.inArray(value, array, fromIndex) devuelve el primer índice coincidente o -1 si no encuentra el valor. Comprueba la presencia con index !== -1. Cero significa encontrado al principio, así que usar el retorno directamente en un if puede dar una respuesta incorrecta.

El resultado es una posición, no un booleano

La API jQuery.inArray() recibe valor, array e índice inicial opcional en ese orden. Es una utilidad global llamada $.inArray(...) o jQuery.inArray(...), no un método de selección DOM como $(selector).inArray(...).

Retorno Significado Boolean(index) index !== -1
0 Encontrado en la primera entrada false true
Entero desde 1 Encontrado en ese índice true true
-1 No encontrado en el rango true false

if (index) e index > 0 omiten la primera entrada. JavaScript considera -1 verdadero en condiciones; negarlo sin más tampoco sirve. Compara explícitamente con -1 o comprueba que sea al menos cero.

Ejemplo completo variando tipo e inicio

Guarda todo el código en UTF-8 como inarray-demo.html y ábrelo en el navegador. Necesitas internet para cargar el archivo oficial de jQuery 4.0.0 desde su red de distribución de contenidos, CDN, sin instalar paquetes. Tipos, inicios positivos/negativos, array vacío y comparación se ejecutaron con 3.7.1 y 4.0.0.

El array es [0, "0", "alpha", 0]. Value procede de opciones predefinidas, sin evaluar expresiones de cadenas. Solo From index se convierte mediante Number() en posición 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 el número cero se encuentra al principio:

value=0 (number)
index=0
found=true
Boolean(index)=false
  1. 0 (string) da índice 1: número 0 y cadena "0" son distintos.
  2. Vuelve a 0 (number) y pon From index 1: devuelve 3 y omite el cero numérico anterior.
  3. 3 también devuelve 3 porque se incluye la posición de inicio.
  4. 9 supera la longitud: índice -1 y found false, aunque Boolean(index) sigue true.
  5. -1 inicia en la última posición, índice 3, y encuentra cero numérico.
  6. Con inicio 0, alpha y missing dan 2 y -1. Reset restaura cero numérico e inicio cero; Search repite las condiciones actuales.

Comparación estricta y límites de fromIndex

La comparación es estricta, como ===. "0" no se convierte a número 0 y las subcadenas no coinciden. Define el tipo deseado de las entradas, las conversiones permitidas y cómo tratar sus fallos.

Sin inicio se usa cero. Un inicio negativo se calcula desde el final, pero la búsqueda sigue hacia delante. Muy antes del array comienza en cero; desde su longitud devuelve -1. El índice resultante es absoluto, no relativo al inicio. Con duplicados devuelve la primera coincidencia desde esa posición.

Los objetos se comparan por referencia, no por propiedades parecidas. Ejecuta este fragmento completo en Console de las herramientas de desarrollo para comparar el mismo objeto, uno nuevo, NaN y 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

Elegir indexOf o includes y proteger lo siguiente

Para posiciones en arrays normales puedes usar array.indexOf(value, fromIndex) nativo. No hace falta añadir jQuery a un proyecto solo para una búsqueda. La llamada es array.indexOf(value), frente a $.inArray(value, array).

Para presencia únicamente, array.includes(value, fromIndex) devuelve true o false. Sus reglas no son idénticas: NaN produce -1 con $.inArray() e indexOf(), pero true con includes(). Siguen importando referencias y distinción número/cadena.

Comprueba -1 antes de usar el resultado para borrar. Pasar un fallo directamente a splice() puede quitar la última entrada. Si el resultado difiere, revisa tipos, orden de argumentos, inicio, referencias y cambios en el array original.