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?
:正如此處所述http://clojure.org/special_forms。只需搜索:as。 – octopusgrabbus
完美的作品。謝謝! –