создание древовидного представления на основе parent_id

#html #tree #elixir #phoenix

Вопрос:

У меня есть список карт, и я изо всех сил пытаюсь построить html-дерево, которое после нажатия на элемент показывает список его дочерних элементов. Каков наилучший способ сделать это?

Например: У нас есть список карт: [%Person{name: "name1", id: 1, parent_id: nil}, %Person{name: "name2", id: 2, parent_id: 1},%Person{name: "name3", id: 3, parent_id: 2}]

Я хочу получить что-то вроде этого:

 name1 ↓
       name2 ↓
              name 3
 

Я буду благодарен за помощь!

Ответ №1:

Это может быть сложной проблемой, потому что, если вам нужно перейти к последнему листу дерева, вам придется пройти список много раз (я позволю кому-нибудь другому сказать вам точное O(n)).

Однако, если вам просто нужно показать ближайших детей, как следует из вашего вопроса, Enum.filter/2 это ваш друг. Вы могли бы написать функцию, которая принимает список людей и идентификатор родителя, детей которого вы хотите видеть.

Например, если вы хотите найти всех людей в корне (где parent_id = nil ):

 iex> parent_id = nil 
nil
iex> Enum.filter(people, fn %{parent_id: id} -> id == parent_id end)
[%{id: 1, name: "name1", parent_id: nil}]
 

Комментарии:

1. Огромное спасибо за помощь! Это решило мою проблему и значительно сократило мой предыдущий код!