ruby MapHash的键

h5qlskok  于 2023-06-22  发布在  Ruby
关注(0)|答案(5)|浏览(116)

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

我的目标是去掉所有键末尾的“00:00:00+00”,得到如下哈希:

{
  "2011-02-01" => 816,
  "2011-01-01" => 58,
  "2011-03-01" => 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_keysMap回my_hash的键:

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

但这会返回以下错误:

TypeError: can't convert String into Integer

如何将parsed_keysMap回my_hash的键?

7bsow1i6

7bsow1i61#

你为什么不这么做呢

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}
i7uq4tfw

i7uq4tfw2#

有一个新的“Rails方式”方法来完成这个任务:)
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys

0vvn1miw

0vvn1miw3#

另一种备选方案可以是:
1.Map
1.返回已转换的两个元素数组[converted_key,converted_value]
1.转换回哈希

irb(main):001:0> {a: 1, b: 2}.map{|k,v| [k.to_s, v.to_s]}.to_h               
=> {"a"=>"1", "b"=>"2"}
waxmsbnn

waxmsbnn4#

iblue’s answer的基础上,当从每个字符串中删除时间时,您可以为gsub的模式使用regexp而不是字符串。例如:

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

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

kpbpu008

kpbpu0085#

使用Ruby标准库中的**Hash#transform_keys**:

my_hash.transform_keys { |key| key.gsub(" 00:00:00+00", "") }
Hash#transform_keys可用时

该方法已添加到标准库in Ruby 2.5中,该库于2017-12-25发布。Hash#transform_keys也曾经在Active Support中定义,从Rails 4.0.1开始(2013-11-01发布)。Active Support在Rails 6.0中将该方法定义为removed,因为Rails 6.0依赖于Ruby 2.5。

相关问题