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

209

我有一个数组

foo = %w(1 2 3 4 5 6 7 8 9 10)

我该如何将这个数组分割或“分块”成较小的数组?

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

foo.chunk(3)
# => [[1,2,3],[4,5,6],[7,8,9],[10]]
2个回答

398

看一下Enumerable#each_slice

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

3
如此简单,如此红宝石。我使用了 t = []; d.each_slice(3) {|s| t << s},... 为什么我没有尝试 #to_a 呢,谢谢朋友。 - Dorian
不错。我使用了类似于 foo.each_slice(3).each_with_index { |f, i| puts "#{f}, #{i}" } 的方法来按块(或“片段”)处理数组。 - user664833
2
如果数组大小不能被块数整除,有没有办法将剩余的块与前一个块合并?因此,在您的示例中,“[“10”]”将与“[“7”,“8”,“9”]”合并,以形成最后一个块“[“7”,“8”,“9”,“10”]”? - Mohamad

62

如果你正在使用Rails,你也可以使用in_groups_of

foo.in_groups_of(3)

16
请注意,in_groups_of使用了each_slice并进行了“填充”,如果您不需要填充,请使用each_slice。 - Urkle
8
实际上,你可以向in_groups_of传递第二个参数,告诉它使用什么进行填充,如果该参数为false,它就不会进行填充。因此,无论如何都不需要使用each_slice。 - FrontierPsycho
5
小心使用in_groups_of方法,它会为nil创建空元素。比如说,若你使用arr = [0,1,2,3,4]in_groups_of(3)一起使用,则结果为[[0,1,2],[3,4,nil]]。在某些情况下,这可能会造成麻烦。 - Penguin
7
如果你使用foo.in_groups_of(2, false),它不会用nil元素填充。 - Canuk
这只是Rails... - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接