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])