Tengo una serie de objetos:
Object = { 1 : { name : bob , dinner : pizza }, 2 : { name : john , dinner : sushi }, 3 : { name : larry, dinner : hummus } }Quiero poder buscar en el objeto/matriz dónde está la clave "cena" y ver si coincide con "sushi".
Sé que jQuery tiene $.inArray, pero no parece funcionar en matrices de objetos. O tal vez estoy equivocado. indexOf también parece funcionar solo en un nivel de matriz.
¿No hay ninguna función o código existente para esto?
Si tienes una matriz como
var people = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ]; Puede usar el método de filter de un objeto Array:
people.filter(function (person) { return person.dinner == "sushi" }); // => [{ "name": "john", "dinner": "sushi" }]En las implementaciones de JavaScript más nuevas, puede usar una expresión de función:
people.filter(p => p.dinner == "sushi") // => [{ "name": "john", "dinner": "sushi" }] Puedes buscar personas que tienen "dinner": "sushi" usando un map
people.map(function (person) { if (person.dinner == "sushi") { return person } else { return null } }); // => [null, { "name": "john", "dinner": "sushi" }, null] o una reduce
people.reduce(function (sushiPeople, person) { if (person.dinner == "sushi") { return sushiPeople.concat(person); } else { return sushiPeople } }, []); // => [{ "name": "john", "dinner": "sushi" }]¡Estoy seguro de que puede generalizar esto a claves y valores arbitrarios!
jQuery tiene un método jQuery.grep que funciona de manera similar a la función de filter ES5 de @adamse's Answer y debería funcionar bien en navegadores más antiguos.
Usando el ejemplo de Adamse:
var peoples = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ];puedes hacer lo siguiente
jQuery.grep(peoples, function (person) { return person.dinner == "sushi" }); // => [{ "name": "john", "dinner": "sushi" }]Si va a realizar esta búsqueda con frecuencia, considere cambiar el formato de su objeto para que la cena sea realmente una clave. Esto es como asignar una clave principal agrupada en una tabla de base de datos. Así por ejemplo:
Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } } Ahora puede acceder fácilmente de esta manera: Object['sushi']['name']
O si el objeto realmente es así de simple (solo 'nombre' en el objeto), podría cambiarlo a:
Obj = { 'pizza' : 'bob', 'sushi' : 'john' } Y luego acceda a él como: Object['sushi'] .
Obviamente, no siempre es posible o ventajoso reestructurar su objeto de datos de esta manera, pero el punto es que, a veces, la mejor respuesta es considerar si su objeto de datos está estructurado de la mejor manera. Crear una clave como esta puede ser más rápido y crear un código más limpio.