2015-05-29 77 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

回答