Posted at

RubyのHashを&:lastで値順でソートする

RubyのHashを値順でソートするこれが普通だと思うのですが、

> h = { a: 3, b: 1, c: 2 }

> h.sort_by { |_, v| v }
=> [[:b, 1], [:c, 2], [:a, 3]]

記号ばっかりでタイプするのが面倒なので、irbとかで使い捨てコード書くときは主にこう書いてます。

> h.sort_by(&:last)

=> [[:b, 1], [:c, 2], [:a, 3]]

Hashのsort_by等のブロックの引数にはキーと値の配列が渡ってくるので、

> h.sort_by { |kv| p kv }

[:a, 3]
[:b, 1]
[:c, 2]

h.sort_by(&:last) で値順のソートが出来ます。

> h.sort_by { |kv| kv[1] }

=> [[:b, 1], [:c, 2], [:a, 3]]

> h.sort_by { |kv| kv.last }
=> [[:b, 1], [:c, 2], [:a, 3]]

> h.sort_by(&:last)
=> [[:b, 1], [:c, 2], [:a, 3]]