2012-10-12 48 views
2

獲取價值在Ruby中,我有紅寶石

res = [[0, :product, "client"], [0, :os, "windows"], [0, :architecture, "32rs"]] 

我想操作系統的價值。我可以通過res [1] [2]來完成,但我不想依賴索引,因爲它可以改變。我擁有的關鍵是:os,那麼找到它的最好方法是什麼?

+4

如果你不想依賴數組索引,那麼這個數據應該是真正的哈希結構。 – pje

回答

5

假如你不能改變的數據結構的方式,你可以做這樣的事情:

res.select{|h| h.include?(:os)}.map(&:last) 

但在我看來,你的數據更好地與哈希表示。

res_hash = res.each_with_object({}) do |value, memo| 
    memo[value[1]] = value[2] 
end 
# => {:product=>"client", :os=>"windows", :architecture=>"32rs"} 

然後你就可以訪問離散數據的屬性是這樣的:

res_hash[:os] 
# => "windows" 
+0

您可以使用散列[]代替注入來構建散列。 – tokland

+0

謝謝。我最初並不想改變它。但後來我決定在下面閱讀你的和@Boris評論後將其轉換爲散列。順便說一下,如果我有嵌套數組,例如res = [[0,:product,「client」],[0,:os,「windows」],[0,:體系結構,「32rs」],[0,:address,[0,:link,「XwjmnS 「]]現在我想要獲得鏈接的價值? – JVK

4
hash = Hash[res.map{ |a| a[1..-1] }] 
hash[:os] # windows 
+0

+1,雖然'[]'上的那些填充空間嚴重傷害了我的眼睛 – tokland

+0

哇那樣整潔:) – JVK

+0

@JVK:和更多地方比使用注入... – tokland

0

雖然@pje回答的假設下,你不能改變的數據,我將闡述他的建議有點在散列中構造數據:

res = [ [0, product: "client"], 
     [0, os: "windows"], 
     [0, architecture: "32rs"] ] 

逗號存在和冒號位置的微小變化會導致Ruby編譯器解析[]表達爲對於其最後一個元素的哈希:

[ [0, {product: "client}], [0, {os: "windows"}], [0, architecture: "32rs"] ] 

然後你就可以解決你所需要的舒適爲

res[1][1][:os] 

如果您關心的是第二級陣列的順序會改變,你應該重組數據更深,如:

res = { product: [ 0, "client" ], os: [ 0, "windows" ], architecture: [ 0, "32rs" ] ] 

並解決它的方式。

+0

感謝鮑里斯,從來不知道冒號和逗號的變化可以做出這種改變。很高興今天學到新東西:) – JVK

+0

這是一個很不完善的文件。 –