按条件分块数组

时间:2018-10-02 12:31:28

标签: 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'组成,并且当该数组具有'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中实现吗?

2 个答案:

答案 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]]
#   ]