【发布时间】:2016-08-12 07:58:03
【问题描述】:
在clojure中,我怎样才能像这样转一个嵌套的地图:
(def parent {:id "parent-1"
:value "Hi dude!"
:children [{:id "child-11"
:value "How is life?"
:children [{:id "child-111"
:value "Some value"
:children []}]}
{:id "child-12"
:value "Does it work?"
:children []}]})
进入这个:
[
[{:id "parent-1", :value "Hi dude!"}]
[{:id "parent-1", :value "Hi dude!"} {:id "child-11", :value "How is life?"}]
[{:id "parent-1", :value "Hi dude!"} {:id "child-11", :value "How is life?"} {:id "child-111", :value "Some value"}]
[{:id "parent-1", :value "Hi dude!"} {:id "child-12", :value "Does it work?"}]
]
我在非常糟糕的递归尝试中磕磕绊绊,现在我的大脑已经筋疲力尽了。
到目前为止,我所得到的如下。它确实得到了正确的数据,但是它把数据放在了一些额外的不需要的嵌套向量中。
如何解决这个问题? 在 Clojure 中有没有一种很好的惯用方式来做到这一点?
谢谢。
(defn do-flatten [node parent-tree]
(let [node-res (conj parent-tree (dissoc node :children))
child-res (mapv #(do-flatten % node-res) (:children node))
end-res (if (empty? child-res) [node-res] [node-res child-res])]
end-res))
(do-flatten parent [])
产生:
[
[{:id "parent-1", :value "Hi dude!"}]
[[
[{:id "parent-1", :value "Hi dude!"} {:id "child-11", :value "How is life?"}]
[[
[{:id "parent-1", :value "Hi dude!"} {:id "child-11", :value "How is life?"} {:id "child-111", :value "Some value"}]
]]]
[
[{:id "parent-1", :value "Hi dude!"} {:id "child-12", :value "Does it work?"}]
]]
]
【问题讨论】:
-
您能描述一下这次重新格式化的目标吗?
-
通过这个谜题,我试图更好地了解如何在 Clojure 中最好地处理数据转换。
标签: clojure