如何将Ruby数组拆分(块)成X个元素的一部分?

mač*_*ček 167 ruby arrays

我有一个阵列

foo = %w(1 2 3 4 5 6 7 8 9 10)
Run Code Online (Sandbox Code Playgroud)

如何将其拆分或"分块"为更小的数组?

class Array
  def chunk(size)
    # return array of arrays
  end
end

foo.chunk(3)
# => [[1,2,3],[4,5,6],[7,8,9],[10]]
Run Code Online (Sandbox Code Playgroud)

Mla*_*vić 318

看看Enumerable#each_slice:

foo.each_slice(3).to_a
#=> [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"], ["10"]]
Run Code Online (Sandbox Code Playgroud)

  • 如此简单,如此红宝石。我使用了`t = []; d.each_slice(3) {|s| t << s}`,...我为什么不试试#to_a,谢谢。 (2认同)
  • 如果数组大小不能均匀地划分为块数,是否有办法将剩余块与前一个块合并?因此,在您的示例中, `["10"]` 将与 `["7", "8", "9"]` 合并以生成最后一个块 `["7", "8", "9", “10”]`? (2认同)

Hea*_*ead 39

如果您正在使用rails,您还可以使用in_groups_of:

foo.in_groups_of(3)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,in_groups_of使用each_slice并且如果您不需要填充也执行"填充",然后使用each_slice (11认同)
  • 实际上,你可以将第二个参数传递给in_groups_of,告诉它要填充什么,如果这是假的,它就不会填充.所以,无论如何都不需要each_slice. (7认同)
  • 小心.它为`nil`制作空元素.例如,如果你使用`in_groups_of(3)`创建`arr = [0,1,2,3,4]`,那么它的结果是`[[0,1,2],[3,4,nil] ]`.在某些情况下,它可能会带来一些麻烦. (4认同)
  • @Penguin如果使用`foo.in_groups_of(2,false)`它将不会填充`nil`元素 (3认同)