@OrdeO
just......newbie

Как получить поддерево заданного узла, если узлы дерева находятся в массиве?

Есть массив из хэшей, которые описывают дерево, каждый элемент массива имеет свой id и id родителя:

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},
]

Как написать метод, который на вход получит какой-нибудь элемент массива, а на выход вернет всех его потомков? Пример, я хочу получить всех потомков вот этого элемента: {id: 24, parent_id: 23}. Метод должен вернуть

[
  {id: 30, title: 'aah',  parent_id: 24},
  {id: 31, title: 'aaz', parent_id: 24},
]

Или, к примеру, хочу получить потомков вот этого элемента: {id: 25, 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}
]
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 1
nbekseitov
@nbekseitov
Ruby developer
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


Написал на скорую руку, подредактируйте как-нибудь под свой метод
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы