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

どうしてこんなことをしてみませんか?

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}
于 2012-07-16T13:30:59.950 に答える
6

このタスクには新しい「Railsway」メソッドがあります:)

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

于 2016-04-08T00:14:42.107 に答える
3

iblue answerを使用すると、正規表現を使用してこの状況を処理できます。次に例を示します

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. 変換された2つの要素の配列を返します[converted_key、c​​onverted_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 に答える