Différence entre la fonction indexOf et findIndex du tableau

125

Je suis confus entre la différence entre les deux fonctions indexOf et find Index dans un tableau.

La documentation dit

findIndex - Renvoie l'index du premier élément du tableau où prédicat est vrai, et -1 dans le cas contraire.

et

indexOf - Renvoie l'index de la première occurrence d'une valeur dans un tableau.

Rahul Singh
la source
4
Je pense que la différence est que l'on prend une fonction comme argument (permettant des recherches plus sophistiquées, comme disons que vous cherchiez la première occurrence d'une valeur avec une sous-chaîne spécifique au lieu de juste la valeur entière), on prend juste la valeur que vous ' vous cherchez. Ce n'est en fait pas une mauvaise question. Les votes négatifs sans explication devraient être soumis à un vote défavorable.
Tim Consolazio
Parfois, il est préférable de commencer par la spécification du langage (c'est-à-dire ECMA-262) et de combler les lacunes avec d'autres éléments: Array.prototype.indexOf (searchElement [, fromIndex]) vs Array.prototype.findIndex (predicate [, thisArg]) .
RobG
Merci Tim et RobG
Rahul Singh

Réponses:

195

La principale différence réside dans les paramètres de ces fonctions:

  • Array.prototype.indexOf()attend une valeur comme premier paramètre. Cela en fait un bon choix pour trouver l'index dans des tableaux de types primitifs (comme une chaîne, un nombre ou un booléen).

  • Array.prototype.findIndex()attend un rappel comme premier paramètre. Utilisez ceci si vous avez besoin de l'index dans des tableaux avec des types non primitifs (par exemple, des objets) ou si votre condition de recherche est plus complexe qu'une simple valeur.

Voir les liens pour des exemples des deux cas.

str
la source
4
Au cas où quelqu'un se demanderait quels types primitifs sont js, ce sont des choses comme string, number, boolean.
John Lee
3
Veuillez noter que indexOfcela fonctionnera pour trouver des objets. Il est important de faire la distinction qu'il accepte un seul objet, pas seulement une valeur, et compare par égalité et non par valeur. Pour la documentation de Mozilla: indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). veuillez modifier l' findIndexexplication pour n'inclure que le membre "ou votre condition de recherche est plus complexe qu'une simple valeur ou référence" pour corriger cela car cela m'a égaré à l'origine. Merci!
brokenalarms
2
@brokenalarms C'est vrai, mais seulement si vous avez une référence à un objet réel dans le tableau. Par exemple, [{a:1}].indexOf({a:1})renvoie -1bien que l'objet semble être le même (mais ce n'est pas le cas). Je ne sais pas si ces informations sont utiles dans la réponse car elles peuvent prêter à confusion. Si vous avez besoin d'en savoir plus sur le comportement exact du langage, vous devriez lire la spécification.
str
De plus, indexOf () compare searchElement aux éléments du Array en utilisant une égalité stricte (la même méthode utilisée par l'opérateur === ou triple-equals).
immirza
A noter cependant qui .indexOf(NaN)reviendra toujours -1car NaN==NaNc'est toujours false. NaN est un type primitif parce que typeof NaNest numberet ainsi sont nullet undefined, donc je modifierais ceci pour éviter de dire des indexOftravaux sur les types primitifs
Matthieu
13

FindIndex est utile si vous voulez trouver le premier élément qui correspond à votre prédicat: dans l'exemple du W3C, il y a des nombres et des correspondances si l'âge du client est supérieur ou égal à 18 ans.

var ages = [3, 10, 18, 20];

function checkAdult(age) {
    return age >= 18;
}

console.log(ages.findIndex(checkAdult));

console:

2

Vous pouvez trouver un index d'élément exact avec la fonction indexOf de Array, mais vous ne pouvez pas passer de prédicat. C'est plus rapide si vous voulez trouver un élément spécifique:

var ages = [3, 10, 18, 20];
console.log(ages.indexOf(10));

Retour:

1

Le comptage d'index commence à 0, donc le premier index d'élément est 0.

Dániel Kis
la source
4

La principale différence réside dans les paramètres de ces fonctions:

-> Array.prototype.indexOf () :

   var fruits = ["Banana", "Orange", "Apple", "Mango"];
   var a = fruits.indexOf("Apple");
   The result of a will be: 2

-> Array.prototype.findIndex () :

       var ages = [3, 10, 18, 20];

       function checkAdult(age) {
        return age >= 18;
       }

       function myFunction() {
         document.getElementById("demo").innerHTML = 
         ages.findIndex(checkAdult);
       }

       The result will be: 2
ashishdudhat
la source
4

Vous pouvez également utiliser includes:

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

mais je préfère la indexOfméthode:

var vals = [ "foo", "bar", 42, "baz" ];
if (~vals.indexOf( 42 )) {
  // found it!
}
zloctb
la source
1
inclut également nécessite un polyfill pour IE
MJB
indexOfest aussi beaucoup plus rapide.
eozzy
4

Une autre différence est qu'avec findIndex (), l'utilisateur peut appliquer une fonction et trouver l'élément dans le tableau qui passe le test.

Mais la même chose n'est pas vraie avec l' opérateur indexOf () . Un utilisateur peut simplement vérifier si l'élément particulier existe ou non dans le tableau.

Alok Ranjan
la source
4

Simple - Quel type de structure de tableau utilisez-vous?

  • Si tableau d'objets findIndex(),;
  • Sinon, indexOf().

"Je veux trouver l'index dans un tableau d'objets , avec la clé" Orange ".

let fruits = [
   { type: "Apple", quantity: 9 },
   { type: "Banana", quantity: 2},
   { type: "Orange", quantity: 8},
   { type: "Pear", quantity: 777}
];

let myIndex = fruits.findIndex(fruit => fruit.type === "Orange"); // Returns 2.

"Je veux trouver l'index dans un tableau simple ".

let fruits = [ "Apple", "Banana", "Pear", "Orange"];

let index = fruits.indexOf("Orange"); // Returns 3.
daCoda
la source
0

Vous pouvez essayer les codes ci-dessous: -

let city = ['Delhi', 'mumbai']
const a = city.findIndex((item) => 
item.toLowerCase()==='delhi')
console.log(a) // returns 0

let c = city.indexOf('mumbai') // returns 1
console.log(c)
Gulsan Borbhuiya
la source
Je ne pense pas que ce code nécessite une explication car ce code semble très simple et facile à comprendre pour un «débutant». De plus, les personnes débutantes ont du mal à comprendre un code complexe, alors je l'ai simplifié. Alors s'il vous plaît, ne dites pas que c'est de mauvaise qualité sans comprendre mon intention.
Gulsan Borbhuiya le
Je n'ai rien trouvé de faible qualité marqué par le système.
Gulsan Borbhuiya le