我有这样的数组
[["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"], ["ROW3", "seven"], ["End", nil], ["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"], ["End", nil], ["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"], ["End", nil]]
我想将内部数组插入另一个数组中,如果该数组由'Page'组成,并且当该数组具有'End'时我停止了,因此生成的数组必须为
[
[["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"], ["ROW3", "seven"], ["End", nil]],
[["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"], ["End", nil]],
[["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"], ["End", nil]]
]
我试图使用ruby的触发器运算符,但是由于它的一端不止一个,因此它占用了整个数组,因此它不起作用。我还有其他方法可以在ruby中实现吗?
答案 0 :(得分:1)
您的直觉是正确的:对于flip-flop运算符而言,这是一个很好的应用程序。如果arr
是您的数组,则可以编写以下内容。
arr.slice_after { |f,_| true if f=='End' .. f=='End' }.to_a
#=> [
# [["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"],
# ["ROW3", "seven"], ["End", nil]],
# [["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"],
# ["End", nil]],
# [["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"],
# ["End", nil]]
# ]
当f == 'End'
时触发器打开,导致true
返回到块,然后,在数组的下一个元素传递到块之前,它检查结束条件,f == 'End'
,导致触发器被关闭,导致“ false”返回到块,直到数组的后续元素的f == 'End'
为true
。
这是另一种方式。
arr.each_with_object([[]]) do |pair,a|
a[-1] << pair
a << [] if pair.first == "End"
end.tap { |a| a.pop if a[-1].empty? }
答案 1 :(得分:0)
your_array
.chunk { |ary| ary.first.match?("Page") }
.each_slice(2)
.map { |group| group.flat_map(&:last) }
#=> [
# [["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"], ["ROW3", "seven"], ["End", nil]],
# [["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"], ["End", nil]],
# [["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"], ["End", nil]]
# ]