0

私は次のようなハッシュを持っています

myhash =   [{"project 1"=>{"09 Apr 12, Mon"=>"2.75"}}, {"project 1"=>{"11 Apr 12,
Wed"=>"3.200000047683716"}}, {"project 1"=>{"25 Apr 12, Wed"=>"0.5099999904632568"}},   
{"project 1"=>{"31 May 12, Thu"=>"1"}}, {"project 1"=>{"01 Jun 12, Fri"=>"1"}}, {"project  
2"=>  {"01 Jun 12, Fri"=>"0"}}, {"project 1"=>{"04 Jun 12, Mon"=>"0.25"}}]

キーに基づいて内部ハッシュをマージしたい。キーが重複しないように

私は試した、

myhash.inject{|memo, el| memo.merge( el ){|k, old_v, new_v| old_v.merge(new_v)}}

これは正しい結果をもたらしています

=>{"project 2"=>{"01 Jun 12, Fri"=>"0"}, "project 1"=>{"01 Jun 12, Fri"=>"1", "09 Apr 
12, Mon"=>"2.75", "11 Apr 12, Wed"=>"3.200000047683716", "31 May 12, Thu"=>"1", "25 Apr  
12, Wed"=>"0.5099999904632568", "04 Jun 12, Mon"=>"0.25"}}

しかし、秩序は失われます。ハッシュ内のキーである日付に基づいてハッシュをソートする方法。

またはマージ自体の時点で、順序は維持されます。

ルビー1.8.7を使用しています

4

1 に答える 1

2

これでうまくいくはずです。並べ替えるために日付を解析したことに注意してください。それらを元の形式に戻すのは簡単です。mergedあなたが提供したマージされた順序付けられていないハッシュです。

merged.map{|k,v| { k => v.sort_by{|d,f| Date.strptime(d.split(',')[0],"%d %b %y").to_s   } } }

(少なくとも 1.8.7 では) 順序付けされていないハッシュではなく、Date オブジェクトと配列を使用することを検討することをお勧めします。

于 2012-07-05T12:30:49.630 に答える