12

我正在使用一个名为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”。

4

4 回答 4

27

Why don't you just do this?

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

This gives you

{"2011-02-01"=>816, "2011-01-01"=>58, "2011-03-01"=>241}
于 2012-07-16T13:30:59.950 回答
6

这个任务有一个新的“Rails way”方法:)

http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys

于 2016-04-08T00:14:42.107 回答
3

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

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

您可以改进模式以处理不同的情况。

希望能帮助到你。

编辑:

抱歉,iblue已经发布了答案

于 2012-07-16T14:27:01.803 回答
1

另一种选择可能是:

  1. 地图
  2. 返回转换后的两个元素数组 [converted_key,converted_value]
  3. 转换回哈希
irb(main):001:0> {a: 1, b: 2}.map{|k,v| [k.to_s, v.to_s]}.to_h               
=> {"a"=>"1", "b"=>"2"}   
于 2021-08-10T13:58:06.340 回答