ume

Ruby ハッシュのバリューでソートする方法

前書き

people = [
  { height: 170, weight: 65, age: 25 },
  { height: 180, weight: 75, age: 32 },
  { height: 160, weight: 50, age: 29 },
  { height: 160, weight: 68, age: 45 },
  { height: 165, weight: 55, age: 23 },
  { height: 172, weight: 70, age: 38 },
  { height: 158, weight: 48, age: 21 },
  { height: 160, weight: 80, age: 5 },
  { height: 168, weight: 60, age: 28 },
  { height: 177, weight: 72, age: 41 }
]

このような配列ハッシュを身長の低いものの順に並び替えたいと思います。身長が同じものが存在する場合年齢が若いものを上に並び替えます。

結論

sort_byメソッドを使用する

 people.sort_by{|person|[person[:height],person[:age]]}

解説

sort_byの引数(person)にはpeopleのハッシュが一つずつ代入される。ブロック( { } )の中でどういう優先順位で並び替えるかを決める。 その際複数のバリューの値で比較する場合(例身長が低いもの順かつ身長が同じ場合、年齢が若い順)は[優先順位1番目,優先順位2番目]みたいな感じで記載する。

余談

身長が低いもの順かつ身長が同じ場合、年齢が高い順に並び替えたい場合どうするの?

 people.sort_by{|person|[person[:height],-person[:age]]}
#-をつけると身長が同じ場合年齢が高い順に並ぶ