El .indexOf()
método tiene un segundo parámetro opcional que especifica el índice desde el que comenzar la búsqueda, 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 en claro cómo desea 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;
}
for
bucle con relleno de matriz de índice..indexOf()
, quería mostrar que puede hacer el trabajo. (Supongo que pensé que el OP podría descubrir cómo hacerlo con un bucle for). Por supuesto, hay otras formas de hacerlo, por ejemplo,Cars.reduce(function(a, v, i) { if (v==="Nano") a.push(i); return a; }, []);
indexes
indices
Otra solución alternativa es utilizar
Array.prototype.reduce()
:NB: Verifique la compatibilidad del navegador para conocer el
reduce
método y use polyfill si es necesario.fuente
:)
Sí, pensé que tal vezreduce
podría ser una buena alternativa.array.reduce((a, e, i) => (e === value) ? a.concat(i) : a, [])
contat
es más lento quepush
, por lo tanto, me quedo con la respuesta.Otro enfoque que usa Array.prototype.map () y Array.prototype.filter () :
fuente
map(…)
comprueba en cada iteración la igualdad dee
yvalue
. Cuando coinciden, se devuelve el índice; de lo contrario, una cadena vacía. Para deshacerse de esos valores falsos,filter(String)
asegúrese de que el resultado solo contenga valores que sean del tipo de cadena y NO estén vacíos.filter(String)
también podría escribirse como:filter(e => e !== '')
String(thing)
coacciona cualquier cosa a una cuerda.Array#filter
devuelve una matriz de todos los valores para los que la condición es verdadera . Debido a que las cadenas vacías son falsas , NO se incluyen en la matriz.Manera más sencilla con estilo es6.
fuente
Puede escribir una solución legible simple para esto usando
map
yfilter
:EDITAR: Si no necesita ser compatible con IE / Edge (o está transpilando su código), ES2019 nos dio flatMap , que le permite hacer esto en una sola línea:
fuente
Nota: MDN proporciona un método que utiliza un bucle while :
No diría que es mejor que otras respuestas. Solo interesante.
fuente
Solo quiero actualizar con otro método sencillo.
También puede utilizar el método forEach.
fuente
fuente
Esto funcionó para mí:
fuente
Solo para compartir otro método, puede usar generadores de funciones para lograr el resultado también:
fuente
Podemos usar Stack e insertar "i" en la pila cada vez que encontremos la condición "arr [i] == value"
Mira esto:
fuente
javascript
, mientras que su respuesta esJava
¿Creo?fuente
Puedes usar Polyfill
}
Úselo así:
fuente
findIndex
recupera solo el primer índice que coincide con la salida de devolución de llamada. Puede implementar la suya propiafindIndexes
extendiendo Array y luego convirtiendo sus matrices en la nueva estructura.fuente
Si tiene la intención de usar guión bajo / lodash, puede hacer
fuente
(["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"]).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0])