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

回答