¿Cómo encontrar los índices de todas las apariciones de un elemento en una matriz?

Resuelto norbdum asked hace 10 años • 16 respuestas

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?

norbdum avatar Dec 27 '13 16:12 norbdum
Aceptado

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;
}
nnnnnn avatar Dec 27 '2013 09:12 nnnnnn

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 reduceel método y use polyfill si es necesario.

VisioN avatar Dec 27 '2013 10:12 VisioN