2012-06-03 17 views
2
創建ID的哈希表

我工作的一些Clojure的代碼,其中我有實體的像這樣的樹:優雅的方式來從一個分層樹結構中的Clojure

foo1 
+-- bar1 
| +-- baz1 
| +-- baz2 
+-- bar2 
    +-- baz3 
foo2 
+-- bar3 
    +-- baz4 

如果我的荒謬ASCII藝術沒有意義,我有一個列表foos,其中每個可以有零個或多個酒吧,其中每個可能有零個或更多bazes

我所要做的是生成一個散列映射,其中鍵是巴茲 ID和值酒吧的ID;即上圖是:

{"baz1" "bar1", "baz2" "bar1", "baz3" "bar2", "baz4" "bar3"} 

我的數據結構是這樣的:

(def foos [ 
    {:id "foo1" :bars [ 
    {:id "bar1" :bazes [ 
     {:id "baz1"} 
     {:id "baz2"} 
    ]} 
    {:id "bar2" :bazes [ 
     {:id "baz3"} 
    ]} 
    ]} 
    {:id "foo2" :bars [ 
    {:id "bar3" :bazes [ 
     {:id "baz4"} 
    ]} 
    ]} 
]) 

這裏是代碼,我有一個構建巴茲對巴圖:

(defn- baz-to-bar [foos] 
    (let [b2b-list (flatten (for [f foos] (flatten (for [bar (:bars c)] (flatten (for [baz (:bazes bar)] [(:id baz) (:id bar)])))))) 
     b2b-map (if (not (empty? b2b-list)) (apply hash-map b2b-list))] 
    (if b2b-map [:b2b (for [baz (keys b2b-map)] (entry-tag baz (b2b-map baz)))]))) 

它的工作原理,但很迷人。

任何人都可以提出一個更優雅,有希望的慣用方式來做到這一點在Clojure?

回答

6
(into {} (for [foo foos 
       {bar-id :id :as bar} (:bars foo) 
       {baz-id :id} (:bazes bar)] 
      {baz-id bar-id})) 
+1

:正如此處所述http://clojure.org/special_forms。只需搜索:as。 – octopusgrabbus

+0

完美的作品。謝謝! –