在Clojure中使用id展平嵌套实体

时间:2015-01-29 16:20:47

标签: dictionary clojure functional-programming entity flatten

假设我用以下形式定义了一个实体(带有嵌套实体):

{: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]
]

我认为它必须是某种递归算法,根据值的类型进行分支,但我无法让它发挥作用。

以前有人做过这样的事吗?

非常感谢任何建议,

1 个答案:

答案 0 :(得分:3)

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