Tengo una matriz como esta:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
¿Cómo puedo obtener el índice del objeto que coincide con una condición, sin iterar sobre toda la matriz?
Por ejemplo, dado prop2=="yutu"
, quiero obtener el índice 1
.
Vi .indexOf()
pero creo que se usa para matrices simples como ["a1","a2",...]
. También verifiqué $.grep()
pero esto devuelve objetos, no el índice.
fuente
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 ).x => x.prop2=="yutu"
funciona con findIndex ()?function(x) { return x.prop2=="yutu" }
index = a.findIndex(function (x) { return x.prop2 == "yutu" })
solucionó el problema para que con el código polyfill, findIndex funcionó en IE11No 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:
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 regresatrue
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:
(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: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.fuente
thg435
hice lo que quería ...Lo que dijo TJ Crowder, de todas formas tendrá algún tipo de iteración oculta, con lodash esto se convierte en:
fuente
Y para los números de matriz básicos también puede hacer esto:
Obtendrá -1 si no puede encontrar un valor en la matriz.
fuente
Iterar sobre todos los elementos de la matriz. Devuelve el índice y verdadero o falso si la condición no coincide.
Importante es el valor de retorno explícito de verdadero (o un valor cuyo resultado booleano es verdadero). La asignación individual no es suficiente, debido a un posible índice con 0 (booleano (0) === falso), que no daría lugar a un error pero deshabilita la ruptura de la iteración.
Editar
Una versión aún más corta de lo anterior:
fuente
|
a bit , es una versión corta de obtener de un índice (con -1) un resultado verdadero / falso , si existe un índice.~
ella no funciona así.!!(index = 0)
y la!!~(index = 0)
diferencia de hecho. ¡Gracias!Puede usar Array.prototype.some () de la siguiente manera (como se menciona en las otras respuestas):
https://jsfiddle.net/h1d69exj/2/
fuente
He visto muchas soluciones en lo anterior.
Aquí estoy usando la función de mapa para encontrar el índice del texto de búsqueda en un objeto de matriz.
Voy a explicar mi respuesta usando los datos de los estudiantes.
Paso 1 : crea un objeto de matriz para los estudiantes (opcionalmente puedes crear tu propio objeto de matriz).
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
Paso 2 : crea una variable para buscar texto
var studentNameToSearch = "Divya";
Paso 3 : Crear una variable para almacenar el índice coincidente (aquí usamos la función de mapa para iterar).
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
fuente
fuente
¿Por qué no quieres iterar exactamente? ¡Los nuevos Array.prototype.forEach son excelentes para este propósito!
Si lo desea, puede usar un Árbol de búsqueda binaria para buscar a través de una llamada a un solo método. Esta es una implementación ordenada del árbol de búsqueda BTree y Red black Search en JS: https://github.com/vadimg/js_bintrees , pero no estoy seguro de si puede encontrar el índice al mismo tiempo.
fuente
Un paso usando Array.reduce () - no jQuery
regresará
null
si no se encontró el índice.fuente
fuente
Georg ya ha mencionado que ES6 tiene Array.findIndex para esto. Y algunas otras respuestas son soluciones para ES5 usando el método Array.some.
Un enfoque más elegante puede ser
Al mismo tiempo, me gustaría enfatizar que Array.some puede implementarse con una técnica de búsqueda eficiente binaria u otra. Por lo tanto, podría funcionar mejor para loop en algunos navegadores.
fuente
Prueba este código
fuente