假设我用以下形式定义了一个实体(带有嵌套实体):
{:id 1
:a 7
:b "Bob"
:c {:id 2
:d 9}
}
我想将此转换为[[id key value]]形式的向量向量 e.g。
[
[1 :a 7]
[1 :b "Bob"]
[2 :d 9]
[1 :c 2]
]
我认为它必须是某种递归算法,根据值的类型进行分支,但我无法让它发挥作用。
以前有人做过这样的事吗?
非常感谢任何建议,
太
答案 0 :(得分:3)
tree-seq
和for
救援!
(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 :c 2]
所以我假设你想要那个子图的ID。)