gpt4 book ai didi

clojure - 在 Clojure 中从分层树结构创建 ids HashMap 的优雅方法

转载 作者:行者123 更新时间:2023-12-01 22:19:26 24 4
gpt4 key购买 nike

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

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

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

我想要做的是生成一个 HashMap ,其中键是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 map 的代码:

(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 中执行此操作吗?

最佳答案

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

关于clojure - 在 Clojure 中从分层树结构创建 ids HashMap 的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10873584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com