Dictionary 在Clojure中使用ID展平嵌套实体

Dictionary 在Clojure中使用ID展平嵌套实体,dictionary,clojure,functional-programming,entity,flatten,Dictionary,Clojure,Functional Programming,Entity,Flatten,假设我在表单中定义了一个实体(带有嵌套实体): {:id 1 :a 7 :b "Bob" :c {:id 2 :d 9} } 我想将其转换为[[id key value]]形式的向量向量 e、 g 我认为它必须是某种递归算法,根据值的类型进行分支,但我不能完全让它工作 以前有人做过这样的事吗 任何建议都将不胜感激 马特。树序列和为营救 (for [m (tree-seq map? vals data) ;; traverse nested maps

假设我在表单中定义了一个实体(带有嵌套实体):

{:id 1
 :a 7
 :b "Bob"
 :c {:id 2
     :d 9}
}
我想将其转换为[[id key value]]形式的向量向量 e、 g

我认为它必须是某种递归算法,根据值的类型进行分支,但我不能完全让它工作

以前有人做过这样的事吗

任何建议都将不胜感激


马特。

树序列
和为营救

 (for [m (tree-seq map? vals data)       ;; traverse nested maps
       :when (map? m)                    ;; we only care about maps
       [k v] m                           ;; traverse key-value-pairs
       :when (not= k :id)]               ;; ignore the ':id' key
   [(:id m) k (if (map? v) (:id v) v)])
 ;; => ([1 :c 2] [1 :b "Bob"] [1 :a 7] [2 :d 9])
这将以深度优先的方式(
tree-seq
)遍历数据,然后使用
for
查找和处理感兴趣的值。(我不确定你是如何想出
[1:c2]
的,所以我假设你想要那里的子地图的ID。)

 (for [m (tree-seq map? vals data)       ;; traverse nested maps
       :when (map? m)                    ;; we only care about maps
       [k v] m                           ;; traverse key-value-pairs
       :when (not= k :id)]               ;; ignore the ':id' key
   [(:id m) k (if (map? v) (:id v) v)])
 ;; => ([1 :c 2] [1 :b "Bob"] [1 :a 7] [2 :d 9])