2011-08-04 18 views
0

私はハッシュの深いハッシュことがあります。順序:キーによってハッシュ* category_:solution_ *ハッシュを下:私はソートするRubyのハッシュをソートする方法は?

my_hash = { 
    :category_1 => { 
     :solution_1 => { :order => 1 }, 
     :solution_2 => { :order => 2 } 
    }, 
    :category_2 => { 
     :solution_3 => { :order => 3 }, 
     :solution_4 => { :order => 4 } 
    } 
} 

。助言がありますか?

(固定)

+1

あなたは結果として何をしたいですか?ネストの1つのレベルを削除したいですか?さもなければ、あなたのハッシュはすでに注文されています... –

+0

あなたはどんな出力をしますか? :カテゴリハッシュまたは:ダミーハッシュ?そして、もし1つが「1」と「4」を、もう1つが「2」と「3」を注文すればどうなるでしょうか? – Gareth

答えて

3

[OK]を、あなたは、あなたの質問に指定されていませんでしたので、私はあなたが1層を除去したいと仮定しています。

my_hash = { 
    :category_1 => { 
     :solution_1 => { :order => 2 }, 
     :solution_2 => { :order => 3 } 
    }, 
    :category_2 => { 
     :solution_3 => { :order => 4 }, 
     :solution_4 => { :order => 1 } 
    } 
} 

Hash[my_hash.inject({}) { |h, (k, v)| h.merge(v) }.sort_by { |k,v| v[:order] }] 
#=> {:solution_4=>{:order=>1}, :solution_1=>{:order=>2}, :solution_2=>{:order=>3}, :solution_3=>{:order=>4}} 

EDIT:

は、アカウントにあなたの明確化を撮影する(そしてまだ私は上記の投稿を修正ソートされていないハッシュから開始):ソートが動作するか私が実際に見始めハッシュを少し変更し

sorted = my_hash.inject({}) do |h, (k, v)| 
    h[k] = Hash[v.sort_by { |k1, v1| v1[:order] }] 
    h 
end 
#=> {:category_1=>{:solution_1=>{:order=>2}, :solution_2=>{:order=>3}}, :category_2=>{:solution_4=>{:order=>1}, :solution_3=>{:order=>4}}} 
3

のは、あなたが年齢に人の以下のハッシュを持っているとしましょう:

people = { 
    :fred => { :name => "Fred", :age => 23 }, 
    :joan => { :name => "Joan", :age => 18 }, 
    :pete => { :name => "Pete", :age => 54 } 
} 

使用sort_by我々はどこへ行きたいかを得るために:

people.sort_by { |k, v| v[:age] } 
    # => [[:joan, {:name=>"Joan", :age=>18}], 
     [:fred, {:name=>"Fred", :age=>23}], 
     [:pete, {:name=>"Pete", :age=>54}]] 
関連する問題