Diferencia entre indexOf y función findIndex de matriz

125

Estoy confundido entre la diferencia entre las dos funciones indexOf y encontrar Index en una matriz.

La documentación dice

findIndex: devuelve el índice del primer elemento de la matriz donde el predicado es verdadero y -1 en caso contrario.

y

indexOf: devuelve el índice de la primera aparición de un valor en una matriz.

Rahul Singh
fuente
4
Creo que la diferencia es que uno toma una función como argumento (permitiendo hallazgos más sofisticados, como digamos que estaba buscando la primera aparición de un valor con una subcadena específica en lugar de solo el valor completo), uno simplemente toma el valor que ' que estas buscando. En realidad, no es una mala pregunta. Los votos en contra sin explicación deben ser votables en contra.
Tim Consolazio
A veces es mejor comenzar con la especificación del lenguaje (es decir, ECMA-262) y completar los espacios con otro material: Array.prototype.indexOf (searchElement [, fromIndex]) vs Array.prototype.findIndex (predicate [, thisArg]) .
RobG
Gracias Tim y RobG
Rahul Singh

Respuestas:

195

La principal diferencia son los parámetros de estas funciones:

  • Array.prototype.indexOf()espera un valor como primer parámetro. Esto hace que sea una buena opción encontrar el índice en matrices de tipos primitivos (como cadena, número o booleano).

  • Array.prototype.findIndex()espera una devolución de llamada como primer parámetro. Use esto si necesita el índice en matrices con tipos no primitivos (por ejemplo, objetos) o su condición de búsqueda es más compleja que solo un valor.

Consulte los enlaces para ver ejemplos de ambos casos.

str
fuente
4
En caso de que alguien se pregunte qué tipos primitivos son js, son cosas como cadena, número, booleano.
John Lee
3
Tenga en cuenta que indexOffuncionará para encontrar objetos. Es importante obtener la distinción de que acepta un solo Objeto, no solo un valor, y compara por igualdad, no por valor. Según los documentos de Mozilla: por indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). favor, modifique la findIndexexplicación para incluir solo el elemento "o su condición de búsqueda es más compleja que un solo valor o referencia" para corregir esto, ya que me extravió originalmente. ¡Gracias!
alarmas rotas
2
@brokenalarms Eso es cierto, pero solo si tiene una referencia a un objeto real en la matriz. Por ejemplo, [{a:1}].indexOf({a:1})devuelve -1aunque el objeto parece ser el mismo (pero no lo es). No estoy seguro de si esta información es útil en la respuesta, ya que puede resultar confusa. Si necesita saber más sobre el comportamiento exacto del idioma, debe leer la especificación.
str
Además, indexOf () compara searchElement con elementos de Array usando igualdad estricta (el mismo método usado por el operador === o triple-equals).
immirza
Vale la pena señalar sin embargo que .indexOf(NaN)siempre volverá -1porque NaN==NaNsiempre es false. NaN es un tipo primitivo porque typeof NaNes numbery también son nully undefined, por lo que enmendaría esto para evitar decir que indexOffunciona en tipos primitivos
Mateo
13

FindIndex es útil si desea encontrar el primer elemento que coincida con su predicado: en el ejemplo de W3C, hay números y coincidencias si la edad del cliente es mayor o igual a 18.

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

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

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

consola:

2

Puede encontrar un índice de elemento exacto con la función indexOf de Array, pero no puede pasar un predicado. Es más rápido si desea encontrar un elemento específico:

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

devoluciones:

1

El recuento de índices comienza en 0, por lo que el índice del primer elemento es 0.

Dániel Kis
fuente
4

La principal diferencia son los parámetros de estas funciones:

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

También puede utilizar includes:

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

pero prefiero el indexOfmétodo:

var vals = [ "foo", "bar", 42, "baz" ];
if (~vals.indexOf( 42 )) {
  // found it!
}
zloctb
fuente
1
también incluye requiere un polyfill para IE
MJB
indexOftambién es mucho más rápido.
eozzy
4

Otra diferencia es que con findIndex () el usuario puede aplicar alguna función y encontrar el elemento en la matriz que pasa la prueba.

Pero lo mismo no es cierto con el operador indexOf () . Un usuario puede simplemente verificar si el elemento particular existe en la matriz o no.

Alok Ranjan
fuente
4

Simple: ¿Qué tipo de estructura de matriz está utilizando?

  • Si matriz de objetos findIndex(),;
  • Si no, indexOf().

"Quiero encontrar el índice en una matriz de objetos , con la clave" Naranja ".

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.

"Quiero encontrar el índice en una matriz simple ".

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

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

Puede probar los códigos a continuación: -

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
fuente
No creo que este código requiera ninguna explicación porque este código parece muy simple y fácil de entender para un 'principiante'. Además, las personas que son principiantes enfrentan dificultades para comprender el código complejo, así que lo hice simple. Así que, por favor, no lo digas de baja calidad sin entender mi intención.
Gulsan Borbhuiya
No encontré nada de baja calidad marcado por el sistema.
Gulsan Borbhuiya