您可以chunk自己浏览并跟踪起始索引的输出。只需按每个块的长度递增它。这是我的快速尝试。
chunked = [nil,nil,1,2,nil,3].chunk { |e| !e.nil? }
_, chunks_with_embedded_index = chunked.each_with_object([0, []]) do |(k, chunk), memo|
memo[1] << [k, memo[0], chunk]
memo[0] += chunk.length
end
chunks_with_embedded_index.each {|c| p c }
# >> [false, 0, [nil, nil]]
# >> [true, 2, [1, 2]]
# >> [false, 4, [nil]]
# >> [true, 5, [3]]
您可以将最后一个索引的临时变量提取到一个完整的局部变量中,并且实现更简洁:
chunked = [nil,nil,1,2,nil,3].chunk { |e| !e.nil? }
last_index = 0
chunks_with_embedded_index = chunked.reduce([]) do |memo, (k, chunk)|
memo << [k, last_index, chunk]
last_index += chunk.length
memo
end
chunks_with_embedded_index.each {|c| p c }
# >> [false, 0, [nil, nil]]
# >> [true, 2, [1, 2]]
# >> [false, 4, [nil]]
# >> [true, 5, [3]]