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
- 0 (string) donne l'indice 1 : nombre 0 et chaîne "0" diffèrent.
- Avec 0 (number) et From index 1, le résultat est 3 ; le premier zéro numérique est ignoré.
- Le départ 3 donne encore 3 car il est inclus.
- 9 dépasse la longueur : indice -1 et found false, mais Boolean(index) reste true.
- -1 commence au dernier emplacement, indice 3, et trouve zéro numérique.
- 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.




