今回は、配列の中から特定の条件で要素を探すための
selectメソッドについて、基本的な使い方を紹介します。
先に、この記事で説明するコードを
さらっと載せておきます。
その後に、それぞれの書き方について
具体的な説明をしていきたいと思います。
目次
結論
要素に対してブロック内を評価した値が
真(true)であった要素を、全て含む配列を返します。
真である要素が一つもない場合には、空配列を返します。
array = ["ミミッキュ", "サンダー", "エースバーン"]
# 要素は配列で返ってくる
array.select { |value| value.include?('ン') }
=> ["サンダー", "エースバーン"]
似たようなメソッドにfindがあります。
array = ["ミミッキュ", "サンダー", "エースバーン"]
# 要素が1つだけ返ってくる
array.find {|value| value.include?('ン')}
=> "サンダー"
ハッシュに対して使う場合
# 連想配列の場合、第一引数はkey、第二引数はvalue
hash = { ghost: "ミミッキュ", flying: "サンダー", fire: "エースバーン" }
hash.select { |key| key == :ghost }
=> {:ghost=>"ミミッキュ"}
hash.select { |key, value| value.include?('ン') }
=> {:flying=>"サンダー", :fire=>"エースバーン"}
ハッシュ配列に対して使う場合
hash = [
{ id: 145, name: "サンダー", height: 1.6, weight: 52.6 },
{ id: 778, name: "ミミッキュ", height: 0.2, weight: 0.7 },
{ id: 3, name: "エースバーン", height: 1.4, weight: 33.0 }
]
# 第一引数にハッシュが渡ってくるので、hash[:key]でアクセスできる
hash.select { |value| value[:name].include?('ン') && value[:height] <= 1.5 }
=> [{:id=>3, :name=>"エースバーン", :height=>1.4, :weight=>33.0}]
環境
OS: MacOS
メモリ: 32GB
Dependents
Rails6
Ruby 2.6
CentOS7 on Vagrant
Mysql 5.7
selectメソッドの概要
要素に対してブロック内を評価した値が
真(true)であった要素を、全て含む配列を返します。
真である要素が一つもない場合には、空配列を返します。
ActiveRecordにも、同じselectメソッドがありますが
こちらは取得したレコードから、引数に渡したカラム名の値を取得したい時に使います。
mysqlのselectですね!
今回紹介するのは、Rubyのメソッドです。
基本的な使い方
公式リファレンスはこちらです。
instance method Enumerable#select
配列に対して使います。
例えばこんな配列があったとして
array = ["ミミッキュ", "サンダー", "エースバーン"]
名前に「ン」が入っているものだけを取得したい時は、このようになります。
array.select { |value| value.include?('ン') }
=> ["サンダー", "エースバーン"]
include? は、引数に渡された値が配列に含まれているかをチェックするメソッドです。
findとの違い
配列から要素を取得するメソッドには、findもあります。
findとselectの違いも見てみましょう。
公式リファレンスはこちらです。
instance method Enumerable#find
このブログでも、以前にfindメソッドの使い方を紹介しています。
findは、要素に対してブロックを評価し
真(true)であった最初の要素を返します。
selectの時は
真(true)であった要素を、全て含む配列 でしたね。
selectとfindの違いはここにあります。
試しに、さっきと同じブロックをfindに渡してみましょう。
array = ["ミミッキュ", "サンダー", "エースバーン"]
array.find {|value| value.include?('ン')}
=> "サンダー"
先ほどは配列で返ってきたのに対して
findの時は、要素が1つだけ返ってきました。
最新の要素を取り出したい場合などに便利なメソッドですね。
連想配列に対して使う
では、少し応用してみましょう。
今までのサンプルは、1次元配列に対してselectを使用していました。
次は連想配列(ハッシュ)に対してselectを使ってみます。
keyで探す
タイプをkeyとして、名前を保持しているハッシュを用意しました。
hash = { ghost: "ミミッキュ", flying: "サンダー", fire: "エースバーン" }
例えば、keyがghostの要素をselectで探してみます。
hash.select { |key| key == :ghost }
=> {:ghost=>"ミミッキュ"}
無事に取得できました!
また、連想配列に対してはselect { |key, value| }
と書くことで、
それぞれkeyとその値にアクセスすることもできます。
valueで探す
次は、名前で探してみましょう。
# 連想配列の場合、第一引数はkeyなので、第二引数で探す
hash.select { |key, value| value.include?('ン') }
=> {:flying=>"サンダー", :fire=>"エースバーン"}
上手く取得できました!
ハッシュ配列に対して使う
では最後に、ハッシュの配列に対して
selectで要素を取得してみましょう。
図鑑番号、名前、高さ、重さを保持したハッシュ配列を用意しました。
hash = [
{ id: 145, name: "サンダー", height: 1.6, weight: 52.6 },
{ id: 778, name: "ミミッキュ", height: 0.2, weight: 0.7 },
{ id: 3, name: "エースバーン", height: 1.4, weight: 33.0 }
]
では、名前にンが入り、高さが1.5以下の要素をselectしてみましょう。
hash.select { |value| value[:name].include?('ン') && value[:height] <= 1.5 }
=> [{:id=>3, :name=>"エースバーン", :height=>1.4, :weight=>33.0}]
こんな感じになります、無事にselectできましたね。
まとめ
今回は、Rubyのselectメソッドについて基本的な使い方と
連想配列や、ハッシュ配列に対する使い方を紹介しました。
また、似たようなメソッドのfindとの違いについても紹介しました。
findについては、別の記事でも紹介しています。
実際にRailsアプリで使用する時には、
ActiveRecordから取得してきたレコード群に対して
特定の条件で絞り込みをしたい時などに使うと便利かと思います。