Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Hash | sort_by

概要

Hash#sort_by

詳細

Hashの内容をブロックの内容でソートする

サンプルコード
# encoding: utf-8
require 'tbpgr_utils'
require 'attributes_initializable'

h = {
  hoge_key1: '1',
  hoge_key2: '2',
  hige_key: '3',
  hage_key: '4',
}

class Hoge
  include AttributesInitializable
  attr_accessor_init :name, :age
  def to_hash
    {
      name: @name,
      age: @age,
    }
  end
end

hoges = {
  hoge3: Hoge.new({name: 'hoge3', age: 25}),
  hoge2: Hoge.new({name: 'hoge2', age: 26}),
  hoge1: Hoge.new({name: 'hoge1', age: 27}),
}

bulk_puts_eval binding, <<-EOS
h.sort_by {|k, v|k}
h.sort_by {|k, v|v}
hoges.sort_by {|k, v|k}
hoges.sort_by {|k, v|v.name}
hoges.sort_by {|k, v|v.age}
EOS
__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval
attr_accessor_init

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
出力
h.sort_by {|k, v|k} # => [[:hage_key, "4"], [:hige_key, "3"], [:hoge_key1, "1"], [:hoge_key2, "2"]]
h.sort_by {|k, v|v} # => [[:hoge_key1, "1"], [:hoge_key2, "2"], [:hige_key, "3"], [:hage_key, "4"]]
hoges.sort_by {|k, v|k} # => [[:hoge1, #<Hoge:0x2d41ef8 @name="hoge1", @age=27>], [:hoge2, #<Hoge:0x2d41fa0 @name="hoge2", @age=26>], [:hoge3, #<Hoge:0x2d4c080 @name="hoge3", @age=25>]]
hoges.sort_by {|k, v|v.name} # => [[:hoge1, #<Hoge:0x2d41ef8 @name="hoge1", @age=27>], [:hoge2, #<Hoge:0x2d41fa0 @name="hoge2", @age=26>], [:hoge3, #<Hoge:0x2d4c080 @name="hoge3", @age=25>]]
hoges.sort_by {|k, v|v.age} # => [[:hoge3, #<Hoge:0x2d4c080 @name="hoge3", @age=25>], [:hoge2, #<Hoge:0x2d41fa0 @name="hoge2", @age=26>], [:hoge1, #<Hoge:0x2d41ef8 @name="hoge1", @age=27>]]