【问题标题】:Flattening nested entities with ids in Clojure在 Clojure 中使用 id 展平嵌套实体
【发布时间】:2015-03-28 23:08:23
【问题描述】:
假设我以以下形式定义了一个实体(带有嵌套实体):
{: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]
]
我认为它必须是某种递归算法,它会根据值的类型进行分支,但我无法让它发挥作用。
以前有人做过这样的事吗?
任何建议将不胜感激,
马特。
【问题讨论】:
标签:
dictionary
clojure
functional-programming
entity
flatten
【解决方案1】:
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。)