Differenza tra la funzione indexOf e findIndex dell'array


125

Sono confuso tra la differenza tra le due funzioni indexOf e trova Index in un array.

La documentazione dice

findIndex - Restituisce l'indice del primo elemento dell'array dove predicate è vero e -1 in caso contrario.

e

indexOf - Restituisce l'indice della prima occorrenza di un valore in una matrice.


4
Penso che la differenza sia che si prende una funzione come argomento (consentendo risultati più sofisticati, come si supponga di cercare la prima occorrenza di un valore con una sottostringa specifica invece del solo valore intero), si prende solo il valore che tu ' stai cercando. In realtà non è una brutta domanda. I voti negativi senza spiegazione dovrebbero essere votabili per difetto.
Tim Consolazio

A volte è meglio iniziare con la specifica del linguaggio (ad esempio ECMA-262) e colmare le lacune con altro materiale: Array.prototype.indexOf (searchElement [, fromIndex]) vs Array.prototype.findIndex (predicate [, thisArg]) .
RobG

Grazie Tim e RobG
Rahul Singh

Risposte:


195

La differenza principale sono i parametri di queste funzioni:

  • Array.prototype.indexOf()si aspetta un valore come primo parametro. Questo lo rende una buona scelta per trovare l'indice in array di tipi primitivi (come stringa, numero o booleano).

  • Array.prototype.findIndex()si aspetta una richiamata come primo parametro. Usalo se hai bisogno dell'indice in array con tipi non primitivi (ad esempio oggetti) o la tua condizione di ricerca è più complessa di un semplice valore.

Vedere i collegamenti per esempi di entrambi i casi.


4
Nel caso qualcuno si chieda quali sono i tipi primitivi js, sono cose come stringa, numero, booleano.
John Lee

3
Si prega di notare che indexOffunzionerà per trovare oggetti. È importante ottenere la distinzione che accetta un singolo oggetto, non solo un valore, e confronta per uguaglianza e non per valore. Secondo i documenti di Mozilla: indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). Si prega di modificare la findIndexspiegazione per includere solo il limite "o la tua condizione di ricerca è più complessa di un singolo valore o riferimento" per correggere questo dato che inizialmente mi ha portato fuori strada. Grazie!
allarmi rotti

2
@brokenalarms Questo è vero, ma solo se hai un riferimento a un oggetto reale nell'array. Ad esempio, [{a:1}].indexOf({a:1})restituisce -1anche se l'oggetto sembra essere lo stesso (ma non lo è). Non sono sicuro che questa informazione sia utile nella risposta in quanto potrebbe creare confusione. Se hai bisogno di saperne di più sul comportamento esatto della lingua, dovresti leggere le specifiche.
str

Inoltre, indexOf () confronta searchElement con gli elementi di Array utilizzando l'uguaglianza rigorosa (lo stesso metodo utilizzato dall'operatore === o triplo uguale).
immirza

Da segnalare però che .indexOf(NaN)tornerà sempre -1perché NaN==NaNè sempre false. NaN è un tipo primitivo perché typeof NaNè numbere così sono nulle undefined, quindi lo correggerei per evitare di dire indexOfopere sui tipi primitivi
Matteo

13

FindIndex è utile se vuoi trovare il primo elemento che corrisponde al tuo predicato: nell'esempio del W3C, ci sono numeri e corrispondenze se l'età del cliente è superiore o uguale a 18 anni.

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

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

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

console:

2

Puoi trovare un indice di elemento esatto con la funzione indexOf di Array, ma non puoi passare un predicato. È più veloce se vuoi trovare un elemento specifico:

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

ritorna:

1

Il conteggio dell'indice inizia da 0, quindi l'indice del primo elemento è 0.


4

La differenza principale sono i parametri di queste funzioni:

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

4

Puoi anche usare includes:

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

ma preferisco il indexOfmetodo:

var vals = [ "foo", "bar", 42, "baz" ];
if (~vals.indexOf( 42 )) {
  // found it!
}

1
include anche il polyfill per IE
MJB

indexOfè anche molto più veloce.
eozzy

4

Un'altra differenza è che con findIndex () l'utente può applicare una funzione e trovare l'elemento dell'array che supera il test.

Ma lo stesso non è vero con l' operatore indexOf () . Un utente può semplicemente controllare se il particolare elemento esiste o meno nell'array.


4

Semplice: che tipo di struttura di array stai usando?

  • Se array di oggetti findIndex(),;
  • Altrimenti, indexOf().

"Voglio trovare l'indice in un array di oggetti , con la chiave di" 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.

"Voglio trovare l'indice in un semplice array ".

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

let index = fruits.indexOf("Orange"); // Returns 3.

0

Puoi provare i codici seguenti: -

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)

Non penso che questo codice richieda alcuna spiegazione perché questo codice sembra molto semplice e facile da capire per un "principiante". Inoltre, le persone che sono principianti incontrano difficoltà a comprendere il codice complesso, quindi l'ho reso semplice. Quindi, per favore, non dirlo di bassa qualità senza capire la mia intenzione.
Gulsan Borbhuiya

Non ho trovato nulla di bassa qualità contrassegnato dal sistema.
Gulsan Borbhuiya
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.