Чанк массив по условию - PullRequest
       4

Чанк массив по условию

0 голосов
/ 02 октября 2018

У меня есть такой массив

[["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 голосов
/ 02 октября 2018

Ваша интуиция была верна: это хорошее приложение для оператора триггер .Если 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', в результате чего триггер выключается, в результате чего «ложь» возвращается в блок до тех пор, пока 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? }
0 голосов
/ 02 октября 2018
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]]
#   ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...