Rubyのflattenメソッドが便利
こんにちは!Paruです。
先日、いくつかある配列の中身だけを集約したいとき、多重配列になっていたりする場合にいろいろ困ったので、調べて見つけて「ほほーぅ😊」となったメソッドflatten
を紹介します。
Array#flatten
るりまには、
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次元化されてハッシュはそのままでした。
大変勉強になりました〜🙆♀️