¿Cómo encontrar los índices de todas las apariciones de un elemento en una matriz?
Estoy intentando encontrar los índices de todas las instancias de un elemento, digamos "Nano", en una matriz de JavaScript.
var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];
Probé jQuery.inArray , o de manera similar, .indexOf() , pero solo dio el índice de la última instancia del elemento, es decir, 5 en este caso.
¿Cómo lo consigo para todos los casos?
El .indexOf()
método tiene un segundo parámetro opcional que especifica el índice desde el que comenzar a buscar, por lo que puede llamarlo en un bucle para encontrar todas las instancias de un valor particular:
function getAllIndexes(arr, val) {
var indexes = [], i = -1;
while ((i = arr.indexOf(val, i+1)) != -1){
indexes.push(i);
}
return indexes;
}
var indexes = getAllIndexes(Cars, "Nano");
Realmente no deja claro cómo quiere usar los índices, por lo que mi función los devuelve como una matriz (o devuelve una matriz vacía si no se encuentra el valor), pero podría hacer algo más con los valores de índice individuales. dentro del bucle.
ACTUALIZACIÓN: Según el comentario de VisioN, un bucle for simple haría el mismo trabajo de manera más eficiente y es más fácil de entender y, por lo tanto, más fácil de mantener:
function getAllIndexes(arr, val) {
var indexes = [], i;
for(i = 0; i < arr.length; i++)
if (arr[i] === val)
indexes.push(i);
return indexes;
}
Otra solución alternativa es utilizar Array.prototype.reduce()
:
["Nano","Volvo","BMW","Nano","VW","Nano"].reduce(function(a, e, i) {
if (e === 'Nano')
a.push(i);
return a;
}, []); // [0, 3, 5]
NB: verifique la compatibilidad del navegador para conocer reduce
el método y use polyfill si es necesario.