2012-01-13 64 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