2012-07-16 207 views
6

我与哈希工作的钥匙叫my_hash映射到一个哈希

{"2011-02-01 00:00:00+00"=>816, "2011-01-01 00:00:00+00"=>58, "2011-03-01 00:00:00+00"=>241} 

首先,我尝试解析所有的按键,在my_hash(这是次)。

my_hash.keys.sort.each do |key| 
    parsed_keys << Date.parse(key).to_s 
end 

,给了我这样的:

["2011-01-01", "2011-02-01", "2011-03-01"] 

然后,我尝试parsed_keys映射回my_hash的键:

Hash[my_hash.map {|k,v| [parsed_keys[k], v]}] 

但返回以下错误:

TypeError: can't convert String into Integer 

如何将parsed_keys映射回的密钥my_hash

我的目标是摆脱所有钥匙末尾的“00:00:00 + 00”。

+1

的问题是方法'parsed_keys'是一个数组,'parsed_keys [k]'正在索引数组,所以Ruby期望你使用索引而不是String。如果你真的想让你的代码保持不变,那么'parsed_keys'也应该设置为''parsed_keys [key] = Date.parse(key).to_s'。 – MrDanA 2012-07-16 13:32:38

+0

让我试试这个。非常感谢 ! – Myxtic 2012-07-16 13:40:26

回答

17

为什么你不这样做?

my_hash.map{|k,v| {k.gsub(" 00:00:00+00","") => v}}.reduce(:merge) 

这给你

{"2011-02-01"=>816, "2011-01-01"=>58, "2011-03-01"=>241} 
+0

是的,这是一个伟大的想法。但在某些地方,字符串是“00:00:00”,而其他地方则是“00:00:00 + 00”。我可以使用同一段代码去除这两个字符串吗? – Myxtic 2012-07-16 13:39:42

+0

尝试使用正则表达式。 'my_hash.map {| K,V | {.gb(/。+ $ /,“”)=> v}}。reduce(:merge)'这会删除空格后的所有内容。 – iblue 2012-07-16 14:18:47

+0

这样做!谢谢 ! – Myxtic 2012-07-16 14:20:16

3

使用iblue的回答,您可以使用正则表达式来处理这种情况,例如:

pattern = /00:00:00(\+00)+/ 
my_hash.map{|k,v| {k.gsub(pattern,"") => v}}.reduce(:merge) 

你可以提高模式来处理不同的情况。

希望它有帮助。

编辑:

对不起,iblue已经贴出答案

+0

这会在键上留下一个空格('“2011-01-01”') – iblue 2012-07-16 14:27:58

+0

是的,你说得对,模式应该是/ 00:00:00(\ + 00)+/:) – 2012-07-16 14:34:18

+0

谢谢另一个解决方案胡安。 – Myxtic 2012-07-16 14:49:29