Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Enumerable#flat_mapで多重配列が返ってきそうな処理もシンプルにできる

Enumerable#flat_mapは各要素をブロックに渡し、その返り値を連結した配列を返すメソッドです。
通常のmapなら

['ab','cd','ef'].map(&:chars)
#=> [["a", "b"], ["c", "d"], ["e", "f"]]

となるところを、

['ab','cd','ef'].flat_map(&:chars)
#=> ["a", "b", "c", "d", "e", "f"]

と平らにできます。
…まぁ、この程度ならflatten最初から使えばいいんじゃないかという疑惑も聞こえてきますが


妙に入り組んだ配列群の全ての文字を引っ張り出すのもこの通り

[["ab","cd"],["ef"],["gh","ij","k"]].flatten.flat_map(&:chars)
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]

見た目が美しく無いですが、内部でEnumerableを呼び出す事もできます

[["ab","cd"],["ef"],["gh","ij","k"]].flat_map{|i| i.map{|j| j.chars}.flatten}

#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]