2014-02-20 47 views
1

我需要使用key_name和一組結果中的值創建散列。從地圖結果創建散列

這將是明確的,如果我告訴你我有:

results.map{|r| {r.other_model.key_name=>r.value} } 

那是給我這樣的:

[{"api_token"=>"stes"}, {"Name"=>"nononono"}] 

但我想這一點:

{"api_token"=>"stes", "Name"=>"nononono"} 

是什麼在紅寶石上做到這一點最美麗的方式?

回答

2

待辦事項如下使用Hash::[]

Hash[results.map { |r| [r.other_model.key_name,r.value] } ] 

在Ruby 2.1.0,我們有Hash#to_h

results.map { |r| [r.other_model.key_name,r.value] }.to_h 

或使用Enumerable#each_with_object

results.each_with_object({}) { |r,h| h[ r.other_model.key_name ] = r.value } 
+0

什麼?沒有水龍頭? '{} .tap {| h | results.each {| r | h [r.other_model.key_name] = r.value}}'。像我一樣,如果你喜歡'tap'的聲音,{} .tap {}。tap {}。tap {| h | ...}'也可以。 –

1

到目前爲止,我的最好的方法是這樣的:

Hash[results.map{|r| [r.other_model.key_name, r.value] } ] 
0
results.inject({}){|h, r| h[r.other_model.key_name] = r.value; h} 

這比創建中間數組然後將其轉換爲散列的其他答案更有效。

+0

我是唯一一個被' h'?怎麼樣'合併'而不是? (如果你想說,「克服它」,繼續 - 我可以接受它。) –