Arrays 按条件的块数组

Arrays 按条件的块数组,arrays,ruby,Arrays,Ruby,我有这样的数组 [["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”

我有这样的数组

[["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中还有其他方法可以实现这一点吗?

您的直觉是正确的:这对于操作员来说是一个很好的应用程序。如果
arr
是您的数组,则可以编写以下代码

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]]
#   ]
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? }
arr.each_with_object([[])do | pair,a|

a[-1]以迭代方式思考,您希望1)有一个(空)结果变量2)在数组中迭代,2a)在数组的某个感兴趣区域中时记忆2b)通过存储开始(和结束位置)和2c)将感兴趣区域添加到结果中。到底出了什么问题?数组或可枚举中的哪些方法对你来说是有趣的?Chunk方法,是的,我期待一个类似这样的预定义方法。太棒了!实际上,
match?
方法对我不起作用,所以我使用了
include?
,我使用的是Ruby 2.3.3。这就是原因吗?@Rajagopalan是的,我认为
String#match?
是在2.4左右添加的(你应该升级你的版本),我知道你会想出不同的解决方案。我犯了一个错误,在触发器操作符中给出了page和end。你找对人了。太好了,谢谢你。