¿Cuál es el mejor método para obtener el índice de una matriz que contiene objetos?
Imagina este escenario:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
Ahora me gustaría tener el indexOf
objeto cuya hello
propiedad es 'stevie'
cuál, en este ejemplo, sería 1
.
Soy bastante novato con JavaScript y no sé si hay un método simple o si debería crear mi propia función para hacerlo.
javascript
Antonio Laguna
fuente
fuente
hello
yqaz
?var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos];
[link] ( stackoverflow.com/a/16100446/1937255 )Respuestas:
Creo que puedes resolverlo en una línea usando la función de mapa :
fuente
Array.prototype.map()
Array.prototype.findIndex es compatible con todos los navegadores que no sean IE (no edge). Pero el polyfill proporcionado es agradable.
La solución con el mapa está bien. Pero está iterando sobre toda la matriz en cada búsqueda. Ese es solo el peor de los casos para findIndex, que deja de iterar una vez que se encuentra una coincidencia.
Realmente no hay una manera concisa(cuando los desarrolladores tenían que preocuparse por IE8) , pero aquí hay una solución común:o como una función:
Solo algunas notas:
Por ejemplo,
fuente
En ES2015, esto es bastante fácil:
o, probablemente con un mejor rendimiento para matrices más grandes:
fuente
fuente
Me gusta la respuesta de Pablo, pero Array # indexOf y Array # map no funcionan en todos los navegadores. El subrayado utilizará código nativo si está disponible, pero también tiene retrocesos. Además, tiene el método de extracción para hacer exactamente lo que hace el método de mapa anónimo de Pablo.
fuente
chain
Es superfluo aquí._.pluck(myArray, 'hello').indexOf('stevie')
O prototipo:
fuente
Array.prototype.indexOfObject = function(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; };
if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') return oldIndexOf(property, value);
. Esto se debe a que estos son los pocos tipos que son inmutables. También presentaría un tercer argumento para permitir el retroceso al método nativo si es necesario.Breve
Casos de uso:
API:
fuente
Hice algunas pruebas de rendimiento de varias respuestas aquí, que cualquiera puede ejecutar por sí mismo:
https://jsperf.com/find-index-of-object-in-array-by-contents
Basado en mis pruebas iniciales en Chrome, el siguiente método (usando un bucle for configurado dentro de un prototipo) es el más rápido:
Este código es una versión ligeramente modificada de la respuesta de Nathan Zaetta.
En los puntos de referencia de rendimiento lo probé con el objetivo en el medio (índice 500) y el final (índice 999) de una matriz de 1000 objetos, e incluso si puse el objetivo como el último elemento de la matriz (lo que significa que tiene que recorrer cada uno de los elementos de la matriz antes de que se encuentre) todavía termina siendo el más rápido.
Esta solución también tiene el beneficio de ser una de las más concisas para ejecutar repetidamente, ya que solo la última línea necesita repetirse:
fuente
while
bucle en lugar defor
uno, yperformance.now()
. Me gustaría que esta respuesta fue upvoted cada vez que lo vi antes, me habría ahorrado algún tiempo ...Comparé varios métodos y recibí un resultado con la forma más rápida de resolver este problema. Es un
for
bucle. Es más de 5 veces más rápido que cualquier otro método.Aquí está la página de la prueba: https://jsbench.me/9hjewv6a98
fuente
for-of
bucle no?Mientras, la mayoría de las otras respuestas aquí son válidas. A veces, es mejor hacer una función simple y corta cerca de donde la usará.
Depende de lo que sea importante para ti. Puede guardar líneas de código y ser muy inteligente para usar una línea, o para poner una solución genérica en algún lugar que cubra varios casos extremos. Pero a veces es mejor decir: "aquí lo hice así" en lugar de dejar que los futuros desarrolladores tengan un trabajo adicional de ingeniería inversa. Especialmente si te consideras "un novato" como en tu pregunta.
fuente
Cuidado con el
[0]
.Es apropiado usar
reduce
como enAntonio Laguna
la respuesta.Disculpas por la brevedad ...
fuente
Si su objeto es el mismo objeto que está utilizando dentro de la matriz, debería poder obtener el índice del objeto de la misma manera que lo haría como si fuera una cadena.
fuente
Prueba esto:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
fuente
simple:
fuente
Si solo está interesado en encontrar el puesto, consulte la respuesta de @Pablo .
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
Sin embargo, si está ansioso por encontrar el elemento (es decir, si estaba pensando en hacer algo como esto
myArray[pos]
), hay una forma más eficiente de hacerlo en una línea , utilizandofilter
.element = myArray.filter((e) => e.hello === 'stevie')[0];
Ver resultados de rendimiento (~ + 42% ops / seg): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3
fuente
Vea este ejemplo: http://jsfiddle.net/89C54/
Comienza a contar con cero.
fuente
Hice una función genérica para verificar que el siguiente es el código y funciona para cualquier objeto
La primera alerta devolverá -1 (significa coincidencia no encontrada) y la segunda alerta devolverá 0 (significa coincidencia encontrada).
fuente
Uso
_.findIndex
de la biblioteca underscore.jsAquí está el ejemplo.
_.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1
fuente
Usando el
findIndex
método ES6 , sin lodash ni ninguna otra biblioteca, puede escribir:Esto comparará las propiedades inmediatas del objeto, pero no se repetirá en las propiedades.
Si su implementación aún no proporciona
findIndex
(la mayoría no), puede agregar un polyfill ligero que admita esta búsqueda:(de mi respuesta en este engaño )
fuente
Puede utilizar una función nativa y conveniente
Array.prototype.findIndex()
básicamente:Solo una nota de que no es compatible con Internet Explorer, Opera y Safari, pero puede usar un Polyfill provisto en el siguiente enlace.
Más información:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
fuente
Además de la respuesta de @Monika Garg , puedes usar
findIndex()
(Hay un polyfill para navegadores no soportados).Vi que las personas rechazaron esta respuesta, y espero que lo hayan hecho debido a la sintaxis incorrecta, porque en mi opinión, esta es la forma más elegante.
Por ejemplo:
fuente
Esta es la forma de encontrar el índice del objeto en la matriz
fuente
Esto funciona sin código personalizado
fuente
Simplemente puedes usar
Sin subrayado, no para, solo una reducción.
fuente
fuente
Puede crear su propio prototipo para hacer esto:
algo como:
fuente
Preferiré usar el
findIndex()
método:index
le dará el número de índice.fuente