jQuery / Méthode / jQuery.inArray() - Trouver correctement un indice de tableau

jQuery.inArray(value, array, fromIndex) renvoie l'indice du premier élément correspondant, ou -1 sans résultat. Testez la présence avec index !== -1. Zéro signifie une correspondance au début : utiliser directement ce retour dans un if peut donc donner une mauvaise réponse.

Le retour est une position, pas un booléen

L'API jQuery.inArray() reçoit valeur, tableau et indice de départ facultatif dans cet ordre. C'est un utilitaire global appelé par $.inArray(...) ou jQuery.inArray(...), pas une méthode sur une sélection DOM comme $(selector).inArray(...).

Retour Signification Boolean(index) index !== -1
0 Trouvé au premier emplacement false true
Entier supérieur ou égal à 1 Trouvé à cet indice true true
-1 Absent de la plage de recherche true false

if (index) et index > 0 manquent le premier élément. JavaScript considère -1 comme vrai dans une condition ; une simple négation ne résout donc pas le problème. Comparez explicitement à -1 ou vérifiez un indice supérieur ou égal à zéro.

Exemple complet variant type et départ

Enregistrez tout le code en UTF-8 dans inarray-demo.html et ouvrez-le dans un navigateur. Internet permet de charger le fichier officiel jQuery 4.0.0 depuis le réseau de diffusion de contenu, CDN, sans installer de paquet. Types, départs positifs/négatifs, tableau vide et comparaison ont été exécutés avec 3.7.1 et 4.0.0.

Le tableau est [0, "0", "alpha", 0]. Value vient de choix prédéfinis, sans évaluer d'expression textuelle. Seul From index est converti avec Number() en position de départ.

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

Au départ, le nombre zéro est trouvé au premier emplacement :

value=0 (number)
index=0
found=true
Boolean(index)=false
  1. 0 (string) donne l'indice 1 : nombre 0 et chaîne "0" diffèrent.
  2. Avec 0 (number) et From index 1, le résultat est 3 ; le premier zéro numérique est ignoré.
  3. Le départ 3 donne encore 3 car il est inclus.
  4. 9 dépasse la longueur : indice -1 et found false, mais Boolean(index) reste true.
  5. -1 commence au dernier emplacement, indice 3, et trouve zéro numérique.
  6. Avec départ 0, alpha et missing donnent 2 et -1. Reset restaure zéro numérique et départ zéro ; Search relance les conditions actuelles.

Comparaison stricte et limites de fromIndex

La comparaison est stricte, comme ===. "0" n'est pas converti en nombre 0 et une sous-chaîne ne suffit pas. Décidez du type des valeurs saisies, des conversions autorisées et de leur traitement en cas d'échec.

Le départ omis vaut zéro. Un départ négatif est calculé depuis la fin, mais la recherche reste vers l'avant. Très avant le tableau, elle commence à zéro ; à partir de la longueur, elle renvoie -1. Le résultat est l'indice absolu, pas une position relative au départ. Les doublons donnent seulement la première correspondance à partir de ce départ.

Les objets sont comparés par référence, pas par propriétés semblables. Exécutez ce fragment complet dans la Console des outils de développement pour comparer même objet, nouvel objet, NaN et alternatives natives.

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

Choisir indexOf ou includes et protéger la suite

Pour une position dans un tableau ordinaire, array.indexOf(value, fromIndex) est natif. Un projet sans jQuery n'en a pas besoin uniquement pour une recherche. L'appel est array.indexOf(value), contrairement à $.inArray(value, array).

Pour la présence seule, array.includes(value, fromIndex) renvoie directement true ou false. Les règles ne sont pas parfaitement identiques : NaN donne -1 avec $.inArray() et indexOf(), mais true avec includes(). Références d'objets et distinction nombre/chaîne restent importantes.

Vérifiez -1 avant d'utiliser le résultat pour supprimer un élément. Passer directement un échec à splice() peut supprimer le dernier. En cas d'écart, contrôlez types, ordre des arguments, départ, références et modifications du tableau original.