2010-10-02 10 views
7

Ho una matrice simile a questa.Ruby Accessing Array Elements

[{"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"} 
] 

Come posso fare per l'iterazione attraverso questa serie in modo da poter specificare quale campo voglio stampare e ottenere il valore, così ho potuto fare qualcosa di simile.

puts EntryId.value 

risposta

7

La presenza di parentesi graffe e hashrockets (=>) significa che avete a che fare con un rubino Hash, non un array.

Fortunatamente, il recupero del valore (la cosa a destra dell'arcottino) associato a un qualsiasi tasto (la cosa a sinistra dell'hashring) è un pezzo di torta con Hash: tutto ciò che devi fare è usare il [] operatore.

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

Ecco la documentazione per Hash: http://ruby-doc.org/core/classes/Hash.html

+0

Questo ha funzionato brillantemente. –

+0

Ho un problema simile ma quando uso 'entry [" EntryId "]' Non riesco a convertire la stringa in numero intero (TypeError) ' –

7

Sembra quasi che questa sia una matrice di hash. Supponendo che questo è memorizzato in una variabile in questo modo:

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

singoli elementi della matrice si può accedere con l'indice fra parentesi quadre. È possibile accedere ai valori degli hash con la chiave tra parentesi quadre. Ad esempio, per ottenere il valore di "Field1" del secondo elemento dell'array si usa:

data[1]["Field1"] 

È possibile scorrere la matrice facilmente con i metodi definiti nel Enum mixin.

Se si desidera elaborare l'array è possibile utilizzare ciascuno: questo codice stamperà il valore dell'ID di immissione per ciascun elemento nell'array.

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

Questi dati non devono essere memorizzati in una variabile per funzionare. Si può semplicemente accedere all'array anonimo direttamente con questi metodi:

Ad esempio questo restituirà una matrice di stringa. Dove ogni elemento è dell'array restituito è una variante formata dell'elemento corrispondente nell'array originale.

[{"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

Ogni volta che vedo gli array multi-dimensionali, mi chiedo se non può essere reso più semplice e più facile da capire con una piccola classe o struct, che è come una classe leggera.

ad es.

# 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 

Il vantaggio di creare una struttura come quella di tenere i vostri dati è che si può fare quello che vuoi con ogni elemento - metterli in array, hash, qualunque sia, e ancora accesso ogni singolo elemento e dei suoi campi di la notazione object.fieldname.