Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
配列.flatten / uniq / compact
配列のネスト解除・重複削除・nil除去をそれぞれ行うメソッドです。データのクリーニングによく使われます。
構文
# ネストされた配列を1次元に展開します。
配列.flatten # すべてのネストを解除します。
配列.flatten(深さ) # 指定した深さまで展開します。
# 重複する要素を除去した新しい配列を返します。
配列.uniq
配列.uniq { |要素| キー } # ブロックで一意性の基準を指定します。
# nil 要素を取り除いた新しい配列を返します。
配列.compact
メソッド一覧
| メソッド | 概要 |
|---|---|
| flatten | ネストされた配列をすべて平坦化した新しい配列を返します。 |
| flatten(n) | n段階までのネストを展開した新しい配列を返します。 |
| flatten! | 元の配列を直接平坦化します。変更がない場合は『nil』を返します。 |
| uniq | 重複を除去した新しい配列を返します。最初に出現した要素が残ります。 |
| uniq { |e| } | ブロックの戻り値が同じ要素を重複とみなし、最初の要素だけを残します。 |
| uniq! | 元の配列から重複を直接削除します。変更がない場合は『nil』を返します。 |
| compact | 『nil』要素を取り除いた新しい配列を返します。 |
| compact! | 元の配列から直接『nil』を削除します。変更がない場合は『nil』を返します。 |
サンプルコード
# flatten: ネスト配列を平坦化します。
ネスト配列 = [1, [2, 3], [4, [5, 6]]]
puts ネスト配列.flatten.inspect # [1, 2, 3, 4, 5, 6]
puts ネスト配列.flatten(1).inspect # [1, 2, 3, 4, [5, 6]](1段階のみ展開)
# uniq: 重複を除去します。
重複あり = [1, 2, 2, 3, 3, 3, 4]
puts 重複あり.uniq.inspect # [1, 2, 3, 4]
# ブロックで一意性の基準を指定します(大文字小文字を無視)。
単語 = ["apple", "Apple", "banana", "BANANA"]
puts 単語.uniq { |w| w.downcase }.inspect # ["apple", "banana"]
# compact: nil を除去します。
データ = [1, nil, 2, nil, 3]
puts データ.compact.inspect # [1, 2, 3]
# 組み合わせ例: APIレスポンスのクリーニング。
raw_data = [[1, 2], [3, nil, 4], [2, 5]]
cleaned = raw_data.flatten.compact.uniq.sort
puts cleaned.inspect # [1, 2, 3, 4, 5]
概要
『flatten』『uniq』『compact』はいずれも非破壊的メソッドで、元の配列を変更せず新しい配列を返します。それぞれに破壊的バージョン(末尾に「!」)があります。
『uniq』は最初に出現した要素を残し、以降の重複を削除します。ブロックを渡すことで独自の比較キーを指定できるため、大文字小文字を無視した比較や特定フィールドによる重複チェックに応用できます。
『flatten!』『uniq!』『compact!』は変更がなかった場合に『nil』を返します。メソッドチェーンで使う際は注意が必要です。確実に配列を返したい場合は非破壊版を使ってください。
配列への要素追加・削除は『insert / delete / delete_at』を、配列の結合は『concat / + / zip』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。