Rubyでできることの多様さに感動
こんにちは。まいむです。
今日はフィヨルドブートキャンプで学ぶ中で、Rubyって本当に色々なメソッドがあってすごいな〜と思ったうちの1個についてまとめたいと思います。
多次元配列の要素を条件に従って平坦化したかった
やりたかった内容は多次元配列の要素をある条件に従って平坦化し、新しい配列を作りたいというもの。
# 要素の3つ目以降の配列の0を取り除いて、3つ目の配列のみ平坦化したい ary = [[1,2], [2,3], [10,0], [10,0]] # これがゴール => [[1, 2], [2, 3], [10, 10]]
最初に書いたコードはこんな感じです。
ary = [[1,2], [2,3], [10,0], [10,0]] ary.each_with_index do | str, index | ary[index].delete(0) if str[0] == 10 end ary.each_index do |index| if index >= 3 ary[2].concat ary[index..].flatten ary.slice!(index, index) end end => [[1, 2], [2, 3], [10, 10]]
期待した結果にはなってますね。 もっとシンプルに書けるとレビューをいただき、修正したコードが以下です。
ary = [[1,2], [2,3], [10,0], [10,0]] third_ary = ary[2..].flat_map { |str| str[0] == 10 ? [10] : str } ary = ary[0..1].push(third_ary) => [[1, 2], [2, 3], [10, 10]]
おぉ〜〜〜〜! 長々と書いていた処理がたった2行になりました。
まとめ
レビューで教えていただいたメソッドは flat_map
です。
このメソッドはflatten
とmap
を1個にまとめた感じのもので、各要素をブロックに渡し、その返り値を連結した配列を返します。
[[1,2], [3,4]].flat_map{|i| i.map{|j| j*2}} # => [2,4,6,8]
配列の要素を条件に応じて編集したいことって、多々ありませんか?
そんな時に flat_map
メソッドは便利に使えそうです。
これからも学習で学んだ内容をアウトプットしていきたいと思います。 ありがとうございました♪