RubyのEnumerableがごっちゃになっているのと、便利なメソッドが多いので、 まとめてみます。
例に使用しているrubyのversionは2.4.1です。
map
mapはブロックの結果をまとめた配列を返してくれます。 collectというメソッドもありますが、mapはcollectのエイリアスなので挙動は同じです。
mapの方が短いのでmapを使いがちです。
下の例では仮想通貨の頭文字の配列の中で、'B'という文字列が 含まれるかを判断して返しています。
2.4.1 :003 > coins = [ 'BTC', 'ETH', 'XRP', 'NEM']
=> ["BTC", "ETH", "XRP", "NEM"]
2.4.1 :004 >
2.4.1 :004 > coins.map{ |coin| coin.include?('B')}
=> [true, false, false, false]
Hashの場合は、key と valueを分割できます。 keyを取り出したり、valueを取り出すにはこうします。
2.4.1 :027 > coins_hash = { btc: 'Bitcoin', eth: 'Ethereum', xrp: 'Ripple', nem: 'XEM' }
=> {:btc=>"Bitcoin", :eth=>"Ethereum", :xrp=>"Ripple", :nem=>"XEM"}
2.4.1 :032 > coins_hash.map{ | key, value | value }
=> ["Bitcoin", "Ethereum", "Ripple", "XEM"]
2.4.1 :032 > coins_hash.map{ | key, value | key }
=>[:btc, :eth, :xrp, :nem]
find ( detect ) | 最初に条件に一致したものを返却
findは配列やハッシュの個別のオブジェクトの中で最初に真になったものを返却してくれます。 detectというメソッドもありfindの別名になります。
2.4.1 :090 > coins.find{ |c| c.include?('X') }
=> "XRP"
ハッシュの場合
2.4.1 :084 $gt; coins_hash.find{ | key , value | key.to_s.include?('x') }
=> [:xrp, "Ripple"]
select | 条件に一致したものを配列で取得
selectはブロックが真を返したものを配列で返却してくれます。 findメソッドは最初に一致したものを返却してくれますが、selectは真のものすべてを 返却してくれます。
2.4.1 :095 > coins.select{ |c| c.include?('T') }
=> ["BTC", "ETH"]
ハッシュの場合
2.4.1 :117 > coins_hash.select{ |coin| coin.to_s.include?('t') }
=> {:btc=>"Bitcoin", :eth=>"Ethereum"}
reject | 条件に一致しないものを配列で取得
rejectはselectの反対で偽のものを抽出して配列にしてくれます。
2.4.1 :118 > coins.reject{ |c| c.include?('T') }
=> ["XRP", "NEM"]
ハッシュの場合
2.4.1 :121 > coins_hash.reject{ |coin| coin.to_s.include?('t') }
=> {:xrp=>"Ripple", :nem=>"XEM"}