arrays - Ruby each_slice 到子数组中,如果最后一个子数组的大小与其他子数组不同,则设置默认元素值

标签 arrays ruby

我有一个数组:

["1", "b", "0", "7", "9", "2", "a", "a", "5", "7"]

我想转换成:

 [["1", "b", "0"], ["7", "9", "2"], ["a", "a", "5"], ["7", false, false]]

尝试使用 each_slice 但返回的子数组没有 false 值:

array = ["1", "b", "0", "7", "9", "2", "a", "a", "5", "7"]
array.each_slice(3).to_a
#=> [["1", "b", "0"], ["7", "9", "2"], ["a", "a", "5"], ["7"]]

任何支持所需行为的 Ruby 方法?

最佳答案

您可以计算所需填充元素的数量:

-array.size % chunk_size

通过链接枚举器,可以像 iGian's answer 那样执行填充无需创建中间数组或触及原始数组:

> [1, 2, 3] + [4]
=> [1, 2, 3, 4]
> [1,2,3].each + [4]
=> #<Enumerator::Chain: ...>
> ([1,2,3].each + [4]).to_a
=> [1, 2, 3, 4]

用它做一个方法:

def padded_each_slice(array, chunk_size = 3, pad = false)
  (array.each + Array.new(-array.size % chunk_size, pad)).each_slice(chunk_size)
end

让我们来测试一下:

> array = ["1", "b", "0", "7", "9", "2", "a", "a", "5", "7"]
> padded_each_slice(array).to_a
=> [["1", "b", "0"], ["7", "9", "2"], ["a", "a", "5"], ["7", false, false]]

> array << '1'
> padded_each_slice(array).to_a
=> [["1", "b", "0"], ["7", "9", "2"], ["a", "a", "5"], ["7", "1", false]]

> array << '2'
> padded_each_slice(array).to_a
=> [["1", "b", "0"], ["7", "9", "2"], ["a", "a", "5"], ["7", "1", "2"]]

> array << '3'
> padded_each_slice(array).to_a
=> [["1", "b", "0"], ["7", "9", "2"], ["a", "a", "5"], ["7", "1", "2"], ["3", false, false]]

可能没那么漂亮,但想用链式枚举器添加答案,这是 Ruby 2.6 中引入的新功能。

包括 @Stefan 建议的改进在评论中。

关于arrays - Ruby each_slice 到子数组中,如果最后一个子数组的大小与其他子数组不同,则设置默认元素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56412977/

相关文章:

javascript - 使用键值组合数组中的对象值

Javascript for 循环和数组

php - 无法将数组插入 MySQL

javascript - 使用对象数组动态生成新数组

ruby-on-rails - 检查时间是否介于 ruby 的两倍之间

ruby - 学习树顶

python - 替换数组中的负数,Python

ruby-on-rails - `const_missing' : uninitialized constant (NameError)

ruby-on-rails - 在 ruby​​ on rails 中使用 dataTable 时如何在每行添加复选框?

ruby - Mandrill-api Excon::错误::SocketError