96 votes

Comment trouver une valeur dans un objet / tableau multidimensionnel en Javascript?

J'ai un objet multidimensionnel (c'est en gros un tableau):

 Object = { 1 : { name : bob , dinner : pizza }, 2 : { name : john , dinner : sushi }, 3 : { name : larry, dinner : hummus } }
 

Je veux être capable de rechercher l'objet / tableau où la clé est "dîner", et voir si cela correspond à "sushi".

Je sais que jQuery a $ .inArray, mais cela ne semble pas fonctionner sur les tableaux multidimensionnels. Ou peut-être que je me trompe. indexOf semble également ne fonctionner que sur un seul niveau de tableau.

N'y a-t-il aucune fonction ou code existant pour cela?

225voto

adamse Points 4458

Si vous avez un objet comme ceci

var peoples = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "larry", "dinner": "hummus" }
];

Ignorer ce qui est ci-dessous. Utiliser l' filter méthode!

peoples.filter(function (person) { return person.dinner == "sushi" });
  // => [{ "name": "john", "dinner": "sushi" }]

Vous pouvez rechercher pour les personnes qui ont "dinner": "sushi" à l'aide d'un map

peoples.map(function (person) {
  if (person.dinner == "sushi") {
    return person
  } else {
    return null
  }
}); // => [null, { "name": "john", "dinner": "sushi" }, null]

ou un reduce

peoples.reduce(function (sushiPeople, person) {
  if (person.dinner == "sushi") {
    return sushiPeople.concat(person);
  } else {
    return sushiPeople
  }
}, []); // => [{ "name": "john", "dinner": "sushi" }]

Je suis sûr que vous êtes capable de généraliser cela à l'arbitraire des clés et des valeurs!

18voto

Zach L Points 3560

jQuery a une méthode intégrée jQuery.grep qui fonctionne de manière similaire à la fonction ES5 filter de la réponse de @ adamse et devrait fonctionner correctement sur les navigateurs plus anciens.

En utilisant l'exemple d'Adamse:

 var peoples = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "larry", "dinner": "hummus" }
];
 

vous pouvez faire ce qui suit

 jQuery.grep(peoples, function (person) { return person.dinner == "sushi" });
  // => [{ "name": "john", "dinner": "sushi" }]
 

10voto

alex Points 186293
 var getKeyByDinner = function(obj, dinner) {
    var returnKey = -1;

    $.each(obj, function(key, info) {
        if (info.dinner == dinner) {
           returnKey = key;
           return false; 
        };   
    });

    return returnKey;       

}
 

jsFiddle .

Tant que -1 n'est pas une clé valide.

10voto

dallin Points 574

Si vous allez faire cette recherche fréquemment, envisager de changer le format de votre objet afin de pouvoir le dîner est en fait une clé. C'est le genre de l'affectation d'un primaire cluster clé dans une table de base de données. Ainsi, par exemple:

Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }

Vous pouvez accéder facilement comme ceci: Object['sushi']['name']

Ou si l'objet est vraiment ce simple (juste " nom " dans l'objet), vous pouvez simplement modifier:

Obj = { 'pizza' : 'bob', 'sushi' : 'john' }

Et y accéder ensuite comme: Object['sushi'].

Il n'est évidemment pas toujours possible ou à votre avantage pour restructurer vos données un objet comme ça, mais le fait est que, parfois, la meilleure réponse est d'examiner si votre objet de données est structurée de la façon la meilleure. La création d'une clé de ce genre peut être plus rapide et de créer plus propre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X