2012-06-25 86 views
0

我有一個Mysql2::Result,它有一堆行。結果在哈希格式爲這樣:嘗試遍歷散列,提取唯一鍵並添加值

{"thing_name" => "email", "count(*)" => 1000} 
{"thing_name" => "email", "count(*)" => 800} 
{"thing_name" => "ads",  "count(*)" => 500} 
{"thing_name" => "display", "count(*)" => 700} 

我的目標是通過所有的這些迭代並創建具有每個關鍵之一,其計數與該鍵關聯的值之和的新的哈希。

我可以成功迭代並將「thing_name」放在數組中,並在其上運行.uniq以將重複項合併爲一個條目,但我無法弄清楚如何關聯這些值並對它們進行適當的數學運算。或者如何做這個哈希。

這裏是我到目前爲止的代碼:

thing_type = results.collect {|row| row["thing_name"]} 
thing_type = thing_type.uniq 

任何幫助將非常感激。

回答

4

嘗試這樣:

# Provide a default value of zero for unknown keys 
counts = Hash.new { |hash,key| hash[key] = 0 } 

result.each do |row| 
    counts[ row["thing_name"] ] += row["count(*)"] 
end 

當你傳遞一個塊Hash.new,它會使用該塊時,你第一次嘗試得到一個未知的密鑰(例如,通過對沒有按一個鍵去counts[...] += ...不存在)。 Ruby會調用你的塊並作爲參數傳入現有的哈希對象,以及你試圖設置的關鍵字。

+0

非常感謝@robbrit!你能解釋一下迭代器的hash [key]部分嗎?那裏我有點困惑。 –

+0

在那裏,希望這會有所幫助! – robbrit

+1

打敗了我。我會用Hash.new(0)代替。目前每次找不到密鑰都會調用該塊。使用Hash.new(0)它將返回0. –