我想创建嵌套地图mermaid图这样的Clojure - 变换嵌套地图
{"a" {"b" {"c" nil
"d" nil}}
"e" {"c" nil
"d" {"h" {"i" nil
"j" nil}}}}
我觉得应该先转换嵌套的地图这种形式。那么它应该很容易。
[{:out-path "a" :out-name "a"
:in-path "a-b" :in-name "b"}
{:out-path "a-b" :out-name "b"
:in-path "a-b-c" :in-name "c"}
{:out-path "a-b" :out-name "b"
:in-path "a-b-d" :in-name "d"}
{:out-path "e" :out-name "e"
:in-path "e-f" :in-name "f"}
{:out-path "e" :out-name "e"
:in-path "e-c" :in-name "c"}
{:out-path "e" :out-name "e"
:in-path "e-d" :in-name "d"}
{:out-path "e-d" :out-name "d"
:in-path "e-d-h" :in-name "h"}
{:out-path "e-d-h" :out-name "h"
:in-path "e-d-h-i" :in-name "i"}
{:out-path "e-d-h" :out-name "h"
:in-path "e-d-h-j" :in-name "j"}]
编辑:
这是我创造。但我完全不知道如何添加结果地图的路径。
(defn myfunc [m]
(loop [in m out []]
(let [[[k v] & ts] (seq in)]
(if (keyword? k)
(cond
(map? v)
(recur (concat v ts)
(reduce (fn [o k2]
(conj o {:out-name (name k)
:in-name (name k2)}))
out (keys v)))
(nil? v)
(recur (concat v ts) out))
out))))
你需要用代码的具体帮助你试过了吗?你可以发布吗? – Bill
@Bill,我需要帮助为每个项目添加“路径”。 – Ribelo
通常,将当前级别的路径声明(让)到一个变量中,然后将其添加到正在构建的结构中,然后在递归到下一个级别并继续构建它时将其传递给它。在这种情况下,多元函数可能更容易构造,而不是循环。 – Bill