在 Clojure 中使用 id 展平嵌套实体
Flattening nested entities with ids in Clojure
假设我以以下形式定义了一个实体(带有嵌套实体):
{:id 1
:a 7
:b "Bob"
:c {:id 2
:d 9}
}
我想将其转换为 [[id key value]] 形式的向量向量
例如
[
[1 :a 7]
[1 :b "Bob"]
[2 :d 9]
[1 :c 2]
]
我认为它必须是某种递归算法,根据值的类型进行分支,但我不能完全让它工作。
以前有人做过这样的事吗?
如有任何建议,我们将不胜感激,
马特
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。)
假设我以以下形式定义了一个实体(带有嵌套实体):
{:id 1
:a 7
:b "Bob"
:c {:id 2
:d 9}
}
我想将其转换为 [[id key value]] 形式的向量向量 例如
[
[1 :a 7]
[1 :b "Bob"]
[2 :d 9]
[1 :c 2]
]
我认为它必须是某种递归算法,根据值的类型进行分支,但我不能完全让它工作。
以前有人做过这样的事吗?
如有任何建议,我们将不胜感激,
马特
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。)