¿Cómo puedo obtener el índice del objeto que coincide con una condición (sin iterar a lo largo de la matriz)?
No puede, algo tiene que iterar a través de la matriz (al menos una vez).
Si la condición cambia mucho, entonces tendrá que recorrer y mirar los objetos que contiene para ver si coinciden con la condición. Sin embargo, en un sistema con características ES5 (o si instala una cuña), esa iteración se puede hacer de manera bastante concisa:
var index;
yourArray.some(function(entry, i) {
if (entry.prop2 == "yutu") {
index = i;
return true;
}
});
Que utiliza el nuevo (más o menos) Array#some
la función , lo que coloca a través de las entradas de la matriz hasta que la función se le da devuelve verdadero. La función que le he dado guarda el índice de la entrada coincidente, luego regresa true
para detener la iteración.
O, por supuesto, solo usa un for
bucle. Sus diversas opciones de iteración están cubiertas en esta otra respuesta .
Pero si siempre va a utilizar la misma propiedad para esta búsqueda, y si los valores de las propiedades son únicos, puede recorrer solo una vez y crear un objeto para asignarlos:
var prop2map = {};
yourArray.forEach(function(entry) {
prop2map[entry.prop2] = entry;
});
(O, de nuevo, puede usar un for
bucle o cualquiera de sus otras opciones ).
Luego, si necesita encontrar la entrada con prop2 = "yutu"
, puede hacer esto:
var entry = prop2map["yutu"];
Yo llamo a esto "indexación cruzada" la matriz. Naturalmente, si elimina o agrega entradas (o cambia sus prop2
valores), también necesita actualizar su objeto de mapeo.
0
?). Ambas soluciones hacen más iteraciones de las requeridas, lo cual es menos que ideal si la matriz es grande (aunque las probabilidades de que sea tan grande que un humano lo notaría son bajas, a menos que las búsquedas estén sucediendo mucho ).