Tengo una matriz como esta (con poco más de 3000 objetos en lugar de los 3 aquí):
items = [{name:'charlie', age:'16'}, {name:'ben', age:'18'}, {name:'steve', age:'18'}]¿Cuál es la mejor manera de devolver una matriz con solo los objetos de personas que tienen 18 años? Entonces yo quiero:
items = [{name:'ben', age:'18'}, {name:'steve', age:'18'}]Lo mejor que se me ocurre es esto (usando jQuery):
newArray = [] $.each(items, function(index, item) { if(item.age=='18') { newArray.push(item) } })Teniendo en cuenta que hay 3000 mil objetos, y también que haré esa comparación hasta cincuenta veces de una vez, eso es mucho bucle. ¿Hay una mejor manera?
Puedes usar javascript puro
var wanted = items.filter( function(item){return (item.age==18);} );Y si su navegador no es compatible con la versión 1.6 de javascript, puede encontrar una implementación del método de filtro en https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter
Actualizar
En cuanto a la velocidad, hay una gran diferencia ( tuvo un error en la prueba ) de un bucle normal ( dependiendo del navegador ). Echa un vistazo a esta pequeña prueba que hice en http://jsperf.com/array-filter-vs- bucle/3
Obtenga el elemento y los elementos coincidentes usando el método find () y filter ()
Si desea el primer elemento único coincidente , use el método find () que devuelve un solo objeto.
Si desea que todos coincidan , use el método filter() que devuelve una matriz de objetos.
let items = [{name:'charlie', age:'16'}, {name:'ben', age:'18'}, {name:'steve', age:'18'}] let all = items.filter(item=> item.age==='18') console.log(all); let single = items.find(item=> item.age==='18') console.log(single);Si va a realizar la búsqueda con frecuencia, puede ser mejor mantener una versión de sus datos en un formulario que sea de rápido acceso. He usado underscore.js (http://documentcloud.github.com/underscore/) para que me resulte más fácil, pero este código creará un objeto que mantendrá sus datos indexados por el campo de edad.
Terminas con algo que se parece a esto:
{ "16": [ { "name": "charlie", "age": "16" } ], "18": [ { "name": "ben", "age": "18" }, { "name": "steve", "age": "18" } ] }El código:
var itemsByAge = _(items).reduce(function(memo, item) { memo[item.age] = memo[item.age] || []; memo[item.age].push(item); return memo; }, {}); alert(JSON.stringify(itemsByAge["18"]));