Every day is a new day.

webエンジニアになりたい55歳の私の記録

Rubyのflattenメソッドが便利

こんにちは!Paruです。

先日、いくつかある配列の中身だけを集約したいとき、多重配列になっていたりする場合にいろいろ困ったので、調べて見つけて「ほほーぅ😊」となったメソッドflattenを紹介します。

Array#flatten

docs.ruby-lang.org

るりまには、

flatten は自身を再帰的に平坦化した配列を生成して返します。flatten! は自身を再帰的かつ破壊的に平坦化し、平坦化が行われた場合は self をそうでない場合は nil を返します。 lv が指定された場合、lv の深さまで再帰的に平坦化します。

と書かれています。

引数を書かずに使用する場合、多重配列を1次元の配列に変換します。

自身を再帰的に平坦化する

配列自身を再帰的に平坦化する例です。

array = [1, 2, [[3, 4], 5]]
p array.flatten
# => [1, 2, 3, 4, 5]
p array
# => [1, 2, [[3, 4], 5]] もとの配列は変更なし

自身を破壊的に平坦化する

次はflatten!を使って再帰的ではなく破壊的に平坦化します。

array = [1, 2, [[3, 4], 5]]
p array.flatten!
# => [1, 2, 3, 4, 5]
p array
# => [1, 2, 3, 4, 5] もとの配列も変更されている

平坦化の再帰の深さを整数で指定する

指定した整数のレベル分平坦化します。

(1)を指定すると、1段階分のみ平坦化します。

array = [1, 2, [[3, 4], 5]]
p array.flatten(1)
# => [1, 2, [3, 4], 5]

平坦化が行われなかった場合

すでに1次元の配列だった場合、nilを返します。

array = [1, 2, 3, 4, 5]
p array.flatten
# =>nil

ハッシュも平坦化される

ハッシュも平坦化されて1次元の配列になります。

hash = {"apple" => 100, "orange" => 120, "lemon" => 150}
p hash.flatten
# => ["apple", 100, "orange", 120, "lemon", 150]

じゃあ、多重配列の中にhashがあったらどうなるのかな?

array_h =  [{"apple" => 100, "orange" => 120}, [{"lemon" => 150}]]
p array_h.flatten
# => [{"apple"=>100, "orange"=>120}, {"lemon"=>150}]

↑この場合は配列のみが1次元化されてハッシュはそのままでした。

大変勉強になりました〜🙆‍♀️