2010-10-02 220 views
7

我有一個看起來像這樣的數組。Ruby訪問數組元素

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

我怎麼會去通過這個循環訪問數組,所以我可以指定我想打印出來,並得到其價值領域,所以我可以做這樣的事情。

puts EntryId.value 

回答

7

大括號和hashrockets(=>)的存在意味着你正在處理一個Ruby哈希,不是數組。

幸運的是,檢索與任何一個鍵相關的值(hashrocket右邊的東西)(hashrocket左邊的東西)與Hashes是一塊蛋糕:所有你需要做的就是使用[]運營商。

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

這裏是哈希的文檔:http://ruby-doc.org/core/classes/Hash.html

+0

這工作出色。 – 2010-10-02 21:06:31

+0

我有一個類似的問題,但是當我使用'entry [「EntryId」]'我不能將String轉換爲Integer(TypeError)'' – 2014-03-25 06:09:49

7

它看起來幾乎就像這是一個散列數組。假設這是存儲在一個變量,像這樣:

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

陣列的單個元件可以在方括號中的索引來訪問。散列值可以用方括號中的鍵進行訪問。例如,要獲得第二個數組元素的「字段1」的值,你可以使用:

data[1]["Field1"] 

您可以通過陣列輕鬆地重複使用在Enum mixin定義的方法。

如果你想處理數組,你可以使用每一個:這段代碼將打印數組中每個元素的Entry Id的值。

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

這些數據不需要存儲在變量中工作。你可以直接用這些方法訪問匿名數組:

例如,這將返回一個字符串數組。每個元素是返回數組的元素是原始數組中對應元素的一個格式變體。

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

每當我看到多維數組,我不知道,如果它不能更簡單,更容易理解的小類或結構,這是像一個輕量級的課程。

例如

# 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 

創建這樣一個結構來保存你的數據,你可以做任何你想要與每個項目的優勢 - 把它們放到數組,哈希,什麼人,而且仍然可以訪問各個項目,並通過其領域object.fieldname表示法。