arr = [
{id: 23, title: 'aaa', parent_id: nil},
{id: 24, title: 'aab', parent_id: 23},
{id: 25, title: 'aac', parent_id: 23},
{id: 26, title: 'aad', parent_id: 25},
{id: 27, title: 'aae', parent_id: 25},
{id: 28, title: 'aaf', parent_id: 27},
{id: 29, title: 'aag', parent_id: 27},
{id: 30, title: 'aah', parent_id: 24},
{id: 31, title: 'aaz', parent_id: 24},
]
new_arr = []
get_child = -> (item) do
find_result = arr.select { |x| x[:parent_id] == item[:id] }
if find_result.any?
arr = arr - find_result
new_arr += find_result
find_result.each do |x|
get_child.call(x)
end
end
end
get_child.call({id: 25, parent_id: 23})
puts new_arr
Написал на скорую руку, подредактируйте как-нибудь под свой метод