我正在寻找一种转换方法:
[1,2,3,nil,4,5,nil,6,7,8,9]
进入:
[[1,2,3],[4,5],[6,7,8,9]]
Ruby 中有没有内置的方法可以做到这一点?
我正在寻找一种转换方法:
[1,2,3,nil,4,5,nil,6,7,8,9]
进入:
[[1,2,3],[4,5],[6,7,8,9]]
Ruby 中有没有内置的方法可以做到这一点?
我会使用:
[1,2,3,nil,4,5,nil,6,7,8,9].slice_before{ |e| e.nil? }.map(&:compact)
=> [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
slice_before
当您想通过传入正则表达式搜索重复模式或您可以通过块计算的东西将数组分成块时,它真的很强大。在这里总结太强大了,所以花点时间阅读文档并使用示例。
这应该有效:
array = [1,2,3,nil,4,5,nil,6,7,8,9]
array.inject([[]]) do |result, number|
number ? result.last << number : result << []
result
end
#=> [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
解释时间:-)
- 编辑 -
检查大卫的回复,我检查了 Rails 的实现:
def split(value = nil)
using_block = block_given?
inject([[]]) do |results, element|
if (using_block && yield(element)) || (value == element)
results << []
else
results.last << element
end
results
end
end
如果您跳过块实现,它与我的代码具有完全相同的结构。耶!:)
[1,2,3,nil,4,5,nil,6,7,8,9].split(nil)
Whoopsarray#split
是一种 Rails方法
我发现了一种有趣的东西。可能有一种方法可以缩短它:
[1,2,3,nil,4,5,nil,6,7,8,9].chunk {|e| e.nil?}.select {|e| not e[0]}.flatten(1).delete_if {|e| not e}
我会加入数组,然后拆分数组。
a =[1,2,3,nil,4,5,nil,6,7,8,9]
a = a.join("-").split("--")
a.map! { |a| a.split("-") }
a.map! {|e| e.map! {|f| f.to_i}}
puts a.inspect
#[[1, 2, 3], [4, 5], [6, 7, 8, 9]]
进行了编辑(基于评论),使其再次成为整数。虽然仍然不是一个好的答案。