2012-01-13 105 views
1

我有一個散列這樣的數據:我該如何將這個Ruby哈希轉換爲數組?

[{"total_time"=>"00:04:48.563044"}, {"total_time"=>"00:05:29.835918"}, {"total_time"=>"00:09:38.622569"}] 

但我想這一點:

["00:04:48.563044", "00:05:29.835918", "00:09:38.622569"] 

需要使用Ruby 1.8.7工作。

回答

5

你可能會與此管理:

list.collect(&:values).flatten 
+0

'collect'是一樣的'map'對於那些不太熟悉紅寶石。此外,可以使用「collect!」或「map!」來對對象進行變異,而不是創建新對象。 – Nick 2012-01-13 19:15:49

+0

這太複雜了,一個簡單的地圖會做... – tokland 2012-01-13 19:40:45

+1

在這個非常特殊的情況下,map調用可能更簡單,但是我發佈的這個片段是一個適用於各種環境的通用模式。這是「給我從一維數組中的多個散列值」的方法。 – tadman 2012-01-13 20:32:12

3

有一噸的方式來做到這一點。讓我們把它分解成你需要完成的基本步驟:

  1. 遍歷每個項目哈希
  2. 對於每一個項目的陣列中,搶時間值
  3. 重新組裝那些到一個列表

既然你想抓住每個項目的結果,而不只是看它,你會想要使用map(或collect,他們是現實相同的方法)。這將處理步驟1和步驟3.步驟2本身非常簡單。您只需要獲得item['total_time']的密鑰值。把它放在一起,和你有這樣的:

times.map{ |time| time['total_time'] } 
+2

有很多方法,但我會說這是合理的。在這種情況下,可能用{}而不是do/end結尾?它看起來有點奇怪的代碼如此之短。 – tokland 2012-01-13 19:42:40

+0

是的,在我寫作時,多行語法是修訂時剩下的。我會更新它。 – Emily 2012-01-13 20:02:30

0

談到一噸的方式來實現這一點:

a = [{"total_time"=>"00:04:48.563044"}, {"total_time"=>"00:05:29.835918"}, {"total_time"=>"00:09:38.622569"}] 

p a.map(&:flatten).map(&:last) 
+0

這不適用於1.8.7('Hash'沒有'flatten')。 – 2012-01-13 20:37:56

+0

@undur_gongor然後請把它當作好奇心 – maprihoda 2012-01-13 20:45:44