在clojure中转换嵌套映射

时间:2013-01-01 16:44:29

标签: map clojure traversal

我有一个嵌套的地图,看起来像这样:

{"a" {:points 2} "b" {:points 7} "c" {:points 1} "d" {:points 3}}

我想把它变成一个地图序列,以便排序(使用 sort-by )并在之后打印。

({:name "a" :points 2}
 {:name "b" :points 7}
 {:name "c" :points 1}
 {:name "d" :points 3})

从文档中我发现我需要像 postwalk 这样的东西,但我无法绕过它。

3 个答案:

答案 0 :(得分:6)

(sort-by :name
         (map #(conj {:name (key %)}
                      (val %))
              {"a" {:points 2}
               "b" {:points 7}
               "c" {:points 1}
               "d" {:points 3}}))

-> ({:points 2, :name "a"}
    {:points 7, :name "b"}
    {:points 1, :name "c"}
    {:points 3, :name "d"})

答案 1 :(得分:2)

如果您的目标是按排序顺序打印,为什么不简单地将其放入有序地图? (into (sorted-map) m)

答案 2 :(得分:2)

我建议像:

(sort-by :name 
  (for [[n m] my-map] 
    (into m {:name n})))

这使用了一些方便的技术:

  • 将我的地图分解为[键值]对
  • 的解构
  • 您已经在值中包含地图,因此您可以使用into添加地图
  • 用于构建列表的理解
  • sort-by对最终结果进行排序