Ruby の Hash をソートする時の注意
Hash をソートしたい場合、Hash#sort
でソートすることが出来るんですが、このメソッドは [key, value]
の配列に変換してからソートが行われます。
なので Hash#sort
の戻り値も配列になります。
hash = { b: "homu", c: "mami", a: "mado" } # #sort の戻り値は [key, value] の配列になる pp hash.sort # => [[:a, "mado"], [:b, "homu"], [:c, "mami"]]
この時に結果を Hash
化したい場合は、#to_h
を呼ぶことで Hash になります。
hash = { b: "homu", c: "mami", a: "mado" } # #to_h で [key, value] の配列を Hash 化 pp hash.sort.to_h # => {:a=>"mado", :b=>"homu", :c=>"mami"}
ちなみに value
でソートしたい場合は、配列と同様に #sort_by
が利用できます。
hash = { c: "mami", b: "homu", a: "mado", d: "an" } # #sort_by で value を基準としたソート pp hash.sort_by { |key, value| value }.to_h # => {:d=>"an", :b=>"homu", :a=>"mado", :c=>"mami"} # こうもかけるはず pp hash.sort_by(&:last).to_h # => {:d=>"an", :b=>"homu", :a=>"mado", :c=>"mami"}
知ってると便利