Buscar indices
Si necestiamos encontrar la posición de un elemento dentro de un array podríamos usar un bucle o iterador que recorriera todo el array y fuera comprobando coincidencias, pero existen varios métodos que facilitan la tarea
- findIndex(): busca el primer elemento que cumple una condición
- findLastIndex(): busca el último elemento que cumple una condición
- indexOf(): devuelve el indice de valor buscado
- lastIndexOf(): ultimo elemento que cumple una condición
El método findIndex(callback, [this]) no busca un elemento concreto sino el primer elemento que cumpla con una condición dada mediante la función de llamada (callback). Es similar al método find(), pero no devuelve el valor sino el índice dentro del array del primer valor que cumple con la condición.
var postre =["Melón","Natillas","Manzanas","Melón", "Flan", "Pera","Manzana"];
var numDia;
numDia = postre.findIndex(function(v){return v == "Natillas" || v=="Flan"});
console.log("El dia "+numDia+" no toca fruta");
console.log("Toca "+postre[numDia ]);
La condición no comprueba un valor concreto sino una condición compleja y devuelve el índice del primer valor que la cumple, no devuelve el valor pero se puede leer fácilmente usando ese índice.
El método findLastIndex(callback) Lbusca el elemento que cumpla la condición dada pero recorriendo el array a la inversa, desde el último elemento. Así devuelve el índice del último elemento que cumpla la condición:
var postre =["Melón","Natillas","Manzanas","Melón", "Flan", "Pera","Manzana"];
var numDia;
numDia = postre.findLastIndex(function(v){return v == "Natillas" || v=="Flan"});
console.log("El último día que no tomamos fruta es "+numDia);
Como ves el array se recorre desde el último elemento y se para en el item 4 que no cumple la condición. Si hubieramos usado findIndex hubiera dado 1.
Los otros métodos comprueban un valor concreto sin usar una función callback. La única diferencia entre ellos es el orden de busqueda.
El método indexOf(buscar, [desde]) busca el valor dado en el primer argumento desde el principio del array, o desde el índice que se indique en el segundo argumento, hasta el final.
var postreDias =["Melón","Natillas","Manzanas","Melón", "Flan", "Pera","Manzana"];
var dias = ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado']
var numDia;
numDia= postreDias.indexOf("Manzanas");
console.log("Las manzanas son el "+dias[numDia]);
Por su parte lastIndexof(buscar,[desde]) hace lo mismo pero recorriendo el array al revés: desde el final (o el indice indicado) hacia el principio. No busca desde el principio, sino desde el final.
var turnos=["Luisa", "Ana","Juan", "Luisa", "Pedro"];
numDia= turnos.lastIndexOf("Luisa");
console.log("El últimmo truno de Luisa es el "+ numDia);
Ambos métodos devuelven el valor del indice del elemento que coincida con el valor buscado
Cualquiera de estos métodos se debe usar si lo que se necesita es encontrar la posición de un valor en el array, y no solo si existe el valor
Si se quieren encontrar todos los elementos que tienen un mismo valor lo más simple es usar el método filter() con una función callback de comparación.