Usa el find()
método:
myArray.find(x => x.id === '45').foo;
De MDN :
El find()
método devuelve el primer valor en la matriz, si un elemento en la matriz satisface la función de prueba proporcionada. De undefined
lo contrario se devuelve.
Si quiere encontrar su índice , use findIndex()
:
myArray.findIndex(x => x.id === '45');
De MDN :
El findIndex()
método devuelve el índice del primer elemento de la matriz que satisface la función de prueba proporcionada. De lo contrario, se devuelve -1.
Si desea obtener una matriz de elementos coincidentes, utilice el filter()
método en su lugar:
myArray.filter(x => x.id === '45');
Esto devolverá una matriz de objetos. Si desea obtener una matriz de foo
propiedades, puede hacerlo con el map()
método:
myArray.filter(x => x.id === '45').map(x => x.foo);
Nota al margen: métodos como find()
o filter()
, y las funciones de flecha no son compatibles con navegadores antiguos (como IE), por lo que si desea admitir estos navegadores, debe transpilar su código usando Babel (con el polyfill ).
Michał Perłakowski
fuente
Como ya está usando jQuery, puede usar la función grep que está diseñada para buscar una matriz:
El resultado es una matriz con los elementos encontrados. Si sabe que el objeto siempre está ahí y que solo ocurre una vez, puede usarlo
result[0].foo
para obtener el valor. De lo contrario, debe verificar la longitud de la matriz resultante. Ejemplo:fuente
===
lugar de==
evitar problemas extraños con el==
operador de JavaScript .e.id
yid
será cuerdas, supongo que está bien para su uso==
. Pero si no está seguro, puede enfrentar problemas (ya que'' == 0
estrue
pero'' === 0
esfalse
). Sin mencionar que===
parece ser más rápido ( stackoverflow.com/questions/359494/… ).===
porque funciona exactamente como==
en otros lenguajes de programación. Considero==
que no existe en JavaScript.Otra solución es crear un objeto de búsqueda:
Esto es especialmente interesante si necesita hacer muchas búsquedas.
Esto no necesitará mucha más memoria ya que las ID y los objetos serán compartidos.
fuente
lookup
objeto es una pérdida de tiempo.ECMAScript 2015 proporciona el método find () en matrices:
Funciona sin bibliotecas externas. Pero si desea un soporte de navegador más antiguo , puede incluir este polyfill .
fuente
myArray.find(d=>d.id===45).foo;
.myArray.find(({ id }) => id === 45).foo
. Pero esta es una vieja respuesta que se escribió antes de que la sintaxis de ES2015 fuera tan compatible como ahora. La respuesta de @ Gothdo es actualmente la más actualizada en el hilo.myArray.find(d => d.id === 45)?.foo
.Underscore.js tiene un buen método para eso:
fuente
Creo que la forma más fácil sería la siguiente, pero no funcionará en Internet Explorer 8 (o anterior):
fuente
for
?for
bucle directo .for
bucle terminará en la primera coincidencia.id
Intenta lo siguiente
fuente
fuente
Una versión genérica y más flexible de la función findById anterior:
fuente
Puede obtener esto fácilmente usando la función map () :
Ejemplo de trabajo: http://jsfiddle.net/hunter/Pxaua/
fuente
map
elimina automáticamentenull
elementos. Suena engañoso para mí y para el concepto común demap
, ya que el resultado no es de la misma longitud de la colección original.Puedes usar filtros,
fuente
Si bien hay muchas respuestas correctas aquí, muchas de ellas no abordan el hecho de que esta es una operación innecesariamente costosa si se realiza más de una vez. En un caso extremo, esto podría ser la causa de problemas reales de rendimiento.
En el mundo real, si está procesando muchos elementos y el rendimiento es una preocupación, es mucho más rápido crear inicialmente una búsqueda:
luego puede obtener artículos en un tiempo fijo como este:
También puede considerar usar un Mapa en lugar de un objeto como búsqueda: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
fuente
Usando nativo
Array.reduce
devuelve el elemento objeto si se encuentra, de lo contrario
false
fuente
Si hace esto varias veces, puede configurar un Mapa (ES6):
Entonces simplemente puedes hacer:
fuente
Así es como lo haría en JavaScript puro, de la manera más mínima que pueda pensar que funciona en ECMAScript 3 o posterior. Regresa tan pronto como se encuentre una coincidencia.
fuente
Más genérico y corto
en su caso Ej.
var element = findFromArray(myArray,'id',45)
eso te dará todo el elemento.fuente
Puedes probar Sugarjs desde http://sugarjs.com/ .
Tiene un método muy dulce en matrices,
.find
. Entonces puedes encontrar un elemento como este:También puede pasarle un objeto con más propiedades para agregar otra "cláusula where".
Tenga en cuenta que Sugarjs extiende objetos nativos, y algunas personas consideran esto muy malvado ...
fuente
find
. Mi sugerencia es que si desea ampliar los prototipos nativos, utilice siempre nombres más específicos, dejando los más simples para futuros desarrollos estándar.Sobre la base de la respuesta aceptada:
jQuery:
O CoffeeScript:
fuente
Recientemente, tengo que enfrentar la misma cosa en la que necesito buscar la cadena desde una gran matriz.
Después de buscar, encontré que será fácil de manejar con un código simple:
Código:
Ver https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/
fuente
Iterar sobre cualquier elemento de la matriz. Por cada artículo que visite, verifique la identificación de ese artículo. Si es un partido, devuélvelo.
Si solo quieres el codez:
Y lo mismo con los métodos de matriz de ECMAScript 5:
fuente
Mientras el navegador sea compatible con ECMA-262 , 5a edición (diciembre de 2009), esto debería funcionar, casi de una sola línea:
fuente
bFound
es solo un booleano que estrue
si un elemento cumple la condición requerida.Puede hacer esto incluso en JavaScript puro utilizando la función integrada "filtro" para las matrices:
Así que ahora simplemente pase "id" en lugar de
key
"45" en lugar devalue
, y obtendrá el objeto completo que coincide con un id de 45. Entonces eso sería,fuente
Utiliza la
Array.prototype.filter()
función.DEMO : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
FILTRAR
fuente
.filter
método enobj.info
en bucle anidado.var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Podemos usar los métodos de Jquery
$.each()/$.grep()
o
use la sintaxis ES6:
O utilice Lodash https://lodash.com/docs/4.17.10#filter , subrayado https://underscorejs.org/#filter
fuente
Realmente me gustó la respuesta proporcionada por Aaron Digulla, pero necesitaba mantener mi conjunto de objetos para poder repetirlo más tarde. Entonces lo modifiqué para
fuente
Utilizar:
Debe devolver un objeto por id.
fuente
Esta solución también puede ser útil:
Lo hice así
$.grep
y si un objeto se descubre, la función devolverá el objeto, en lugar de una matriz.fuente
function will return the object, rather than an array
puede tener un error, pero creo que depende de los usuarios.A partir de la respuesta de aggaton , esto es en realidad una función que devuelve el elemento deseado (o
null
si no se encuentra), dado elarray
y unacallback
función que devuelve un valor Truthy para el elemento "correcta":Solo recuerda que esto no funciona de forma nativa en IE8-, ya que no es compatible
some
. Se puede proporcionar un polyfill, alternativamente, siempre existe elfor
ciclo clásico :En realidad es más rápido y más compacto. Pero si no desea reinventar la rueda, le sugiero que use una biblioteca de utilidades como guión bajo o lodash.
fuente
Más corto
fuente
Considere "axesOptions" como una matriz de objetos con un formato de objeto que es {: field_type => 2,: fields => [1,3,4]}
fuente