recorrer - ¿Cómo encontrar un valor en un objeto/matriz multidimensional en Javascript?
recorrer array de objetos javascript (7)
Tengo un objeto multidimensional (básicamente es una matriz):
Object = {
1 : { name : bob , dinner : pizza },
2 : { name : john , dinner : sushi },
3 : { name : larry, dinner : hummus }
}
Quiero poder buscar el objeto / matriz donde está "cenando" y ver si coincide con "sushi".
Sé que jQuery tiene $ .inArray, pero parece que no funciona en arreglos multidimensionales. O tal vez estoy equivocado. indexOf también parece funcionar solo en un nivel de matriz.
¿No hay función o código existente para esto?
Puede encontrar el objeto en la matriz con la biblioteca Alasql :
var data = [ { name : "bob" , dinner : "pizza" }, { name : "john" , dinner : "sushi" },
{ name : "larry", dinner : "hummus" } ];
var res = alasql(''SELECT * FROM ? WHERE dinner="sushi"'',[data]);
Pruebe este ejemplo en jsFiddle .
Puede usar un bucle for para:
for (prop in Obj){
if (Obj[prop][''dinner''] === ''sushi''){
// Do stuff with found object. E.g. put it into an array:
arrFoo.push(Obj[prop]);
}
}
El siguiente ejemplo de violín coloca todos los objetos que contienen dinner:sushi
en una matriz:
Si tiene 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 nuevas implementaciones de JavaScript, puede usar una expresión de función:
people.filter(p => p.dinner == "sushi")
// => [{ "name": "john", "dinner": "sushi" }]
Puede 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 puedes generalizar esto en claves y valores arbitrarios!
Si vas a hacer esta búsqueda con frecuencia, considera cambiar el formato de tu objeto para que la cena sea la clave. Esto es como asignar una clave agrupada primaria 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), simplemente podría cambiarlo a:
Obj = { ''pizza'' : ''bob'', ''sushi'' : ''john'' }
Y luego acceda a él como: Object[''sushi'']
.
Obviamente no siempre es posible o para su beneficio 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.
Ya hay muchas buenas respuestas aquí, ¿por qué no una más? Utilice una biblioteca como lodash o guión bajo :)
obj = {
1 : { name : ''bob'' , dinner : ''pizza'' },
2 : { name : ''john'' , dinner : ''sushi'' },
3 : { name : ''larry'', dinner : ''hummus'' }
}
_.where(obj, {dinner: ''pizza''})
>> [{"name":"bob","dinner":"pizza"}]
jQuery tiene un método jQuery.grep
que funciona de manera similar a la función de filter
ES5 de la respuesta de @ adamse y debería funcionar bien en los 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" }]
var getKeyByDinner = function(obj, dinner) {
var returnKey = -1;
$.each(obj, function(key, info) {
if (info.dinner == dinner) {
returnKey = key;
return false;
};
});
return returnKey;
}
jsFiddle .
Siempre que -1
no sea una clave válida.