2015-05-29 2 views
0

мне нужно преобразовать вектор карты, как это:Преобразовать вектор карты к дереву

[{:id 1 :parent nil :name "a"} 
{:id 2 :parent 1 :name "b"} 
{:id 3 :parent 2 :name "c"} 
{:id 4 :parent 2 :name "d"} 
{:id 5 :parent 4 :name "e"}] 

к этому:

[{:id 1 
    :parent nil 
    :name "a" 
    :nodes [{:id 2 
      :parent 1 
      :name "b" 
      :nodes [{:id 3 
        :parent 2 
        :name "c"} 
        {:id 4 
        :parent 2 
        :name "d" 
        :nodes [{:id 5 :parent 4 :name "e"}]}]}]}] 

UPDATE:

В соответствии с просьбой до сих пор я имеют следующее:

(defn enum [s] 
    (map vector (range) s)) 

(defn build-tree [tree current-path current-parent gr] 
     (if-let [nodes (gr current-parent)] 
     (let [current-path (conj current-path :nodes) 
       new-tree (assoc-in tree current-path nodes)] 
      (first 
      (for [[i node] (enum (get-in new-tree current-path))] 
      (build-tree new-tree (conj current-path i) (:id node) gr)))) 
     tree)) 

(defn list->tree [ls] 
    (let [gr (group-by :parent ls) 
     root (first (gr nil))] 
    (build-tree root [] (:id root) gr))) 

Однако я действительно сомневаюсь, что это идиоматично + он не работает в любом случае (создает только первые узлы, остальные игнорируются). Я также сомневаюсь, что создание дерева настолько сложно. Я действительно думаю, что чего-то не хватает.

+0

Пожалуйста, проявите некоторое усилие. Что у вас есть до сих пор? – fuesika

ответ

1

Вы можете использовать список смежности или рекурсивный подход.

Оба подхода обсуждаются более подробно как ответы to this very similar question.

+0

Это точно такой же вопрос. Большое спасибо за то, что указали на меня. – Unknown

Смежные вопросы