#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. Огромное спасибо за помощь! Это решило мою проблему и значительно сократило мой предыдущий код!