在 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-seqfor 来救援!

 (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。)