Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. Enumerable.each_slice / each_cons / chunk / zip

Enumerable.each_slice / each_cons / chunk / zip

コレクションを一定のサイズで分割したり、複数の要素を結合したりする高度な反復メソッドです。

構文
# n個ずつのグループに分割して反復します。
コレクション.each_slice(n) { |グループ| 処理 }

# n個の連続した要素のまとまりで反復します。
コレクション.each_cons(n) { |グループ| 処理 }

# 要素をn個ずつのチャンクに分けます(ブロックの戻り値が変わる境界で分割)。
コレクション.chunk { |要素| キー }

# 複数の配列を対応するインデックスでまとめます。
配列1.zip(配列2, 配列3)
メソッド一覧
メソッド概要
each_slicen個ずつに分割して繰り返します。最後のグループはn個未満になる場合があります。
each_consn個の連続した要素のウィンドウをずらしながら繰り返します。
chunkブロックの戻り値が変化する境界でグループを区切り、列挙子を返します。
zip対応するインデックスの要素をまとめた配列の配列を返します。
サンプルコード
数値 = [1, 2, 3, 4, 5, 6, 7]

# each_slice で3個ずつ処理します。
数値.each_slice(3) { |グループ| puts グループ.inspect }
# [1, 2, 3]
# [4, 5, 6]
# [7]

# each_cons で3個の連続した組み合わせを取得します。
数値.each_cons(3) { |グループ| puts グループ.inspect }
# [1, 2, 3]
# [2, 3, 4]
# [3, 4, 5]
# [4, 5, 6]
# [5, 6, 7]

# chunk で連続する同じ値をまとめます。
データ = [1, 1, 2, 2, 2, 1, 3, 3]
データ.chunk { |n| n }.each do |キー, グループ|
  puts "#{キー}: #{グループ.inspect}"
end

# zip で2つの配列を対にします。
名前 = ["田中", "山田", "鈴木"]
点数 = [85, 92, 78]
名前.zip(点数).each { |n, s| puts "#{n}: #{s}点" }
概要

『each_slice』はページネーションや一括処理のバッチサイズ制御に、『each_cons』は移動平均や連続する要素の比較に役立ちます。どちらもブロックなしで呼び出すと列挙子(Enumerator)を返します。

『zip』は複数の配列を並べて処理したいときに便利です。対応する要素が存在しない場合は『nil』が補完されるため、配列の長さが異なるときは注意が必要です。『chunk』は連続した同じ属性を持つ要素をまとめるのに使い、『group_by』とは異なり隣接する要素のみをグループ化します。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。