【问题标题】:Elegant way to create a hash map of ids from a hierarchical tree structure in Clojure从 Clojure 中的分层树结构创建 id 哈希映射的优雅方法
【发布时间】:2012-06-08 01:41:26
【问题描述】:

我正在编写一些 Clojure 代码,其中我有一个这样的实体树:

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

如果我荒谬的 ASCII 艺术没有意义,我有一个 foos 列表,每个都可以有零个或多个 bars,每个可能有零个或多个 bazes

我要做的是生成一个哈希映射,其中键是 baz ID,值是 bar 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"}
    ]}
  ]}
])

这是我构建 baz-to-bar 映射的代码:

(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 中提出一种更优雅、更符合语言习惯的方法?

【问题讨论】:

    标签: clojure functional-programming


    【解决方案1】:
    (into {} (for [foo foos
                   {bar-id :id :as bar} (:bars foo)
                   {baz-id :id} (:bazes bar)]
               {baz-id bar-id}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2015-09-28
      • 2022-01-09
      相关资源
      最近更新 更多