ある配列を任意の要素数の配列に分割したい

More than 1 year has passed since last update.


概要

ある配列を任意の長さ n ずつ分解したいです。

例えば、

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]] にしたいということです。

簡単にできるんです。そう Enumerable#each_slice ならね。

array = (0..10).to_a

#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

array.each_slice(3).to_a
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]

Enumerable#each_slice メソッドは Enumerator オブジェクトを返すので、

to_a で Array に変換して完成です :tada:


追記

Active Support コア拡張機能Array#in_groups_of でも同様のことができました。

$ gem install activesupport

require 'active_support/core_ext/array/grouping'

array = (0..10).to_a
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 第 1 引数のみの場合、余りが nil で埋められる。
array.in_groups_of(3)
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, nil]]

# 第 2 引数に false を指定した場合、
# 前述の Enumerable#each_slice を使用した方法と同じ結果になる。
array.in_groups_of(3, false)
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]