【问题标题】: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-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。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-01
      • 2015-01-28
      • 2016-09-07
      • 2017-12-26
      • 2021-11-28
      • 2022-06-27
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多