2012-01-27 60 views
2
[[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]] 

的陣列工作是數組如何使用哈希

我怎麼能得到對應於特定值的值。

說高回報在這個5。 或如何將這個散列數組轉換爲數組,以便搜索變得容易。

我想:

find_all { |v| v['name'] == "Low" } 

但它說:

cant convert String to Integer 

請提供一些指導

+0

最好的解決方案(恕我直言)是改變如何創建結構。你有能力做到這一點嗎? – 2012-01-27 14:06:42

+0

是的馬克我有能力做到這一點,你能指導我通過嗎? – 2012-01-27 14:10:43

+0

嗅覺像一個正常的散列:'status = {「Postponed」=> 10,「Low」=> 3,「Medium」=> 4,「High」=> 5} – dgasper 2012-01-27 14:12:41

回答

1

如果你有一些這樣的代碼:

array = [[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]] 

然後把它變成一個紅寶石哈希:

hash = array.inject({}) {|h, e| h.merge(e.first) } 
# => {"Postponed"=>10, "Low"=>3, "Medium"=>4, "High"=>5} 

所以,你可以很容易地找到 '低' 值:

hash['Low'] 
# => 3 

編輯:馬克托馬斯的答案是相當偉大的,一個d比注射更短,因爲它做同樣的事情。他在我回答之前寫下了它。尼斯;)

0

這個怎麼樣?

arr = [ 
    [{"Postponed"=>10}], 
    [{"Low"=>3}], 
    [{"Medium"=>4}], 
    [{"High"=>5}] 
    ] 
    arr1 = [] 

    arr.each{|a| 
    arr1.push(a[0]) 
    } 

雖然我不知道你真的只是想獲得一個哈希,你會做像這樣:

myHash = {} 

    arr.each{|a| 
    a[0].each{|b, c| 
     myHash[b] = c 
    } 
    } 

你會然後像myHash["Postponed"]

+0

然後如何獲得arr1中的鍵值? – 2012-01-27 14:08:04

+0

我意識到這一點。我想你會更好用散列(請參閱我的後續編輯)。我只提供了arr1,因爲你最初需要一個數組。 – SimonMayer 2012-01-27 14:12:41

+0

thnx西蒙爲您的快速反應! – 2012-01-27 18:09:54

1

訪問它在一般情況下, ,哈希將不是唯一的,所以您需要過濾而不是通過索引選擇一個。例如,假設你有這樣的:

現在讓我們假設你想獲得對應於任何散列與:coconut鍵的值。然後,只需使用:

arr.flatten.map { |h| h[:coconut] }.compact 
# => ["ghi"] 

給出答案列表。在這種情況下,只有一個匹配鍵,所以數組中只有一個條目。如果還有其他的哈希值是有一個:在有椰子鍵,那麼你就會有這樣的:

# => ["ghi", "jkl", "mno"] 

就整體而言,雖然,這是一個非常不尋常的數據結構有。如果你控制結構,那麼你應該考慮使用可以按照你喜歡的方式返回合理答案的對象,而不是哈希。

+0

好吧,thnx很多@John ..它的工作。你也可以告訴我如何改變結構。在你的例子中說,我想將arr轉換爲這樣的[{:apple =>'abc'},{:banana =>'def'}] ..我的意思是正常散列而不是散列陣列 – 2012-01-27 14:13:09

+0

你的榜樣仍然是一組哈希值。 (原始結構是散列數組。)您可以通過'arr.flatten'獲得剛剛描述的內容。 – 2012-01-27 14:39:47

0

你可以簡單地調用#flatten原來陣列上。那會給你一些散列。我認爲你真的想要的只是一個散列。

1.8.7 :006 > [[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]].flatten 
=> [{"Postponed"=>10}, {"Low"=>3}, {"Medium"=>4}, {"High"=>5}] 

我會問,你在做什麼來獲得原始結構?這可以改變嗎?

+0

thnx Thanatos !! – 2012-01-27 18:09:25

9

如何做一個散列出來的高效支持?

arr.flatten.reduce(:merge) 

#=> {"Postponed"=>10, "Low"=>3, "Medium"=>4, "High"=>5} 
+0

thnx馬克,你的答案是有用的:) – 2012-01-27 18:08:39