2010-10-02 6 views
7

J'ai un tableau qui ressemble à ceci.Ruby Accès aux éléments du tableau

[{"EntryId"=>"2", "Field1"=>"National Life Group","DateCreated"=>"2010-07-30 11:00:14", "CreatedBy"=>"tristanoneil"}, 
{"EntryId"=>"3", "Field1"=>"Barton Golf Club", "DateCreated"=>"2010-07-30 11:11:20", "CreatedBy"=>"public"}, 
{"EntryId"=>"4", "Field1"=>"PP&D Brochure Distribution", "DateCreated"=>"2010-07-30 11:11:20", "CreatedBy"=>"public"}, 
{"EntryId"=>"5", "Field1"=>"Prime Renovation Group, DreamMaker Bath & Kitchen", "DateCreated"=>"2010-07-30 11:11:21", "CreatedBy"=>"public"} 
] 

Comment pourrais-je aller sur itérer ce tableau je peux spécifier quel champ que je veux imprimer et obtenir la valeur, alors que je pouvais faire quelque chose comme.

puts EntryId.value 

Répondre

7

La présence d'accolades et hashrockets (=>) signifie que vous avez affaire à un Hash Ruby, pas un tableau. Heureusement, récupérer la valeur (la chose à la droite de la hashrocket) associée à une touche (la chose à gauche de la hashrocket) est un morceau de gâteau avec Hashes: tout ce que vous avez à faire est d'utiliser le [] opérateur.

entry = { "EntryId" => "2", "Field1" => "National Life Group", ... } 
entry["EntryId"] # returns "2" 

Voici la documentation Hash: http://ruby-doc.org/core/classes/Hash.html

+0

Cela a fonctionné avec brio. –

+0

J'ai un problème similaire mais quand j'utilise 'entry [" EntryId "]' Je ne peux pas convertir String en Integer (TypeError) ' –

7

Cela ressemble presque à un tableau de hachages. En supposant que cela est stocké dans une variable comme ceci:

data = [{"EntryId"=>"2", "Field1"=>"National Life Group"}, 
     {"EntryId"=>"3", "Field1"=>"Barton Golf Club"}, 
     {"EntryId"=>"4", "Field1"=>"PP&D Brochure Distribution"} 
     ] 

éléments uniques de la matrice est accessible par l'indice entre crochets. Les valeurs des hachages peuvent être consultées avec la clé entre crochets. Par exemple, pour obtenir la valeur de « Champ1 » du second élément de tableau que vous utilisez:

data[1]["Field1"] 

Vous pouvez parcourir le tableau facilement avec les méthodes définies dans le Enum mixin.

Si vous voulez traiter la baie, vous pouvez utiliser chacune: Ce code affichera la valeur de l'identifiant d'entrée pour chaque élément de votre tableau.

data.each{|entry| puts entry["EntryId"]} 

Ces données n'ont pas besoin d'être stockées dans une variable pour fonctionner. Vous pouvez simplement accéder au tableau anonyme directement avec ces méthodes:

Par exemple, cela retournera un tableau de chaîne. Où chaque élément est du tableau retourné est une variante formatée de l'élément correspondant dans le tableau original.

[{"EntryId"=>"2", "Field1"=>"National Life Group"}, 
{"EntryId"=>"3", "Field1"=>"Barton Golf Club"}, 
{"EntryId"=>"4", "Field1"=>"PP&D Brochure Distribution"} 
].map{|e| "EntryId: #{e["EntryId"]}\t Company Name: #{e["Field1"]}"} 
3

Chaque fois que je vois des tableaux multidimensionnels, je me demande si elle ne peut être rendu plus simple et plus facile à comprendre avec une petite classe ou struct, qui est comme une classe légère.

par exemple.

# define the struct 
Thing = Struct.new("Thing", :entry_id, :field_1, :date_created , :created_by) 

directory = Hash.new  # create a hash to hold your things keyed by entry_id 

# create your things and add them to the hash 
thing = Thing.new(2, "National Life Group", "2010-07-30 11:00:14", "tristanoneil") 
directory[thing.entry_id] = thing 

thing = Thing.new(3, "Barton Golf Club", "2010-07-30 11:00:14", "public") 
directory[thing.entry_id] = thing      

thing = Thing.new(4, "PP&D Brochure Distribution", "2010-07-30 11:00:14", "public") 
directory[thing.entry_id] = thing 

thing = Thing.new(5, "Prime Renovation Group, DreamMaker Bath & Kitchen", "2010-07-30 11:00:14", "public") 
directory[thing.entry_id] = thing 


# then retrieve what you want from the hash 
my_thing = directory[3] 
puts my_thing.field_1 

L'avantage de créer une structure comme celle de tenir vos données que vous pouvez faire ce que vous voulez avec chaque élément - les mettre dans des tableaux, hachages, peu importe, et toujours accéder à chaque article et ses champs par la notation object.fieldname.

Questions connexes