He estado navegando un poco tratando de encontrar una manera eficiente de hacer esto, pero no he llegado a ninguna parte. Tengo una serie de objetos que se ve así:
array[i].id = some number;
array[i].name = some name;
Lo que quiero hacer es encontrar los ÍNDICES de los objetos donde id es igual a, por ejemplo, uno de 0,1,2,3 o 4. Supongo que podría hacer algo como:
var indexes = [];
for(i=0; i<array.length; i++) {
(array[i].id === 0) ? { indexes[0] = i }
(array[i].id === 1) ? { indexes[1] = i }
(array[i].id === 2) ? { indexes[2] = i }
(array[i].id === 3) ? { indexes[3] = i }
(array[i].id === 4) ? { indexes[4] = i }
}
Si bien esto funcionaría, parece ser bastante costoso y lento (sin mencionar que es feo), especialmente si array.length podría ser grande. ¿Alguna idea sobre cómo arreglar esto un poco? Pensé en usar array.indexOf de alguna manera, pero no veo cómo forzar la sintaxis. Esta
array.indexOf(this.id === 0);
por ejemplo, devuelve indefinido, como probablemente debería. ¡Gracias por adelantado!
javascript
arrays
indexof
Petrov
fuente
fuente
Array.prototype.findIndex()
en ECMAScript 2015. La respuesta aceptada fue impresionante.Respuestas:
Tal vez le gustaría utilizar funciones de orden superior como "mapa". Suponiendo que desea buscar por atributo 'campo':
fuente
function hashf(el) { return String(el.id) + "_" + String(el.name); }
. Esto es solo una pista:elementPos = array.map(hashf(x)).indexOf(hash({id:3, name:'Pablo'}));
obviamente, la función hash que proporciono no es válida para todos los casos, ya que'_'
podría formar parte de sus valores, pero es solo un ejemplo rápido de que puede descubrir diferentes métodos hash.indexOf
valor de retorno cuando no puede localizar un valor dado.map, indexOf
, puede usar solo uno llamadofindIndex
....... Ej:[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3}) OR [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
La forma más simple y fácil de encontrar el índice de elementos en la matriz.
Sintaxis ES5:
[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})
Sintaxis ES6:
[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
fuente
findIndex
en developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…obj.id == 3
operador utilizado aquí puede causar una conversión de tipo inesperada, así que use elobj.id === 3
operador, que prueba el mismo valor y tipo.var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
tomó 0.03500000002532033 milisegundos Usarlo[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
tomó 0.00999999747378752 milisegundos.El nuevo método de matriz .filter () funcionaría bien para esto:
jQuery también puede hacer esto con .grep ()
editar: vale la pena mencionar que estas dos funciones simplemente iteran bajo el capó, no habrá una diferencia de rendimiento notable entre ellas y rodar su propia función de filtro, pero ¿por qué reinventar la rueda?
fuente
Si se preocupan por el rendimiento, no vayas con hallazgo o filtro o asignar o cualquiera de los métodos anteriormente discutidos
Aquí hay un ejemplo que demuestra el método más rápido. AQUÍ está el enlace a la prueba real
Bloque de configuración
Método más rápido
Métodos más lentos
Método más lento
fuente
el resultado es una lista de búsqueda para la identificación. con la identificación dada obtenemos el índice del registro.
fuente
fuente
Como no hay respuesta usando una matriz regular
find
:fuente
Una nueva forma de usar ES6
fuente
picked_element
es una matriz en este caso ...const index = array.findIndex(item => item.id === 'your-id');
Esto debería obtener el índice del elemento en la matriz con id === your-id
fuente
Me parece que podría crear un iterador simple con una devolución de llamada para probar. Al igual que:
Entonces podrías invocar así:
fuente
Adaptando la respuesta de Tejs para mongoDB y Robomongo cambié
a
fuente
Usando la
map
función ES6 :fuente
Para resumir toda la gran respuesta anterior y adicional de mi respuesta con respecto a encontrar todos los índices, se produjo en algunos de los comentarios.
fuente
Como todavía no puedo comentar, quiero mostrar la solución que utilicé según el método publicado por Umair Ahmed, pero cuando desea buscar una clave en lugar de un valor:
Entiendo que no responde a la pregunta ampliada, pero el título no especifica lo que se quería de cada objeto, por lo que quiero compartir esto humildemente para ahorrar dolores de cabeza a los demás en el futuro, aunque empiezo, puede que no sea el La solución más rápida.
fuente
Creé una pequeña utilidad llamada super-array donde puedes acceder a los elementos de una matriz mediante un identificador único con complejidad O (1). Ejemplo:
fuente
devolverá el índice 1 (solo funciona en ES 2016)
fuente
Me gusta este método porque es fácil de comparar con cualquier valor en el objeto, sin importar qué tan profundo esté anidado.
fuente