Map 在clojure中转换嵌套映射

Map 在clojure中转换嵌套映射,map,clojure,traversal,Map,Clojure,Traversal,我有一个嵌套的地图,看起来像这样: {"a" {:points 2} "b" {:points 7} "c" {:points 1} "d" {:points 3}} 我想把它转换成一系列的地图,以便排序(使用排序依据),然后打印出来 ({:name "a" :points 2} {:name "b" :points 7} {:name "c" :points 1} {:name "d" :points 3}) 从文档中,我想我需要像postwalk这样的东西,但我不能把我的脑袋绕在它

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

{"a" {:points 2} "b" {:points 7} "c" {:points 1} "d" {:points 3}}
我想把它转换成一系列的地图,以便排序(使用排序依据),然后打印出来

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

从文档中,我想我需要像postwalk这样的东西,但我不能把我的脑袋绕在它周围。

如果你的目标是按排序的顺序打印,为什么不干脆把它放在排序的地图上呢
(进入(已排序的地图)m)

如果您的目标是按已排序的顺序打印,为什么不简单地将其放入已排序的地图中<代码>(进入(排序地图)m)

我建议如下:

(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"})
(sort-by :name 
  (for [[n m] my-map] 
    (into m {:name n})))
这利用了一些方便的技术:

  • 分解结构以将我的地图分解为[键值]对
  • 事实上,您的值中已经有映射,因此您可以使用
    进入
    添加到这些值中
  • 建立列表的一种理解方法
  • 按排序
    对最终结果进行排序

    • 我建议如下:

      (sort-by :name 
        (for [[n m] my-map] 
          (into m {:name n})))
      
      这利用了一些方便的技术:

      • 分解结构以将我的地图分解为[键值]对
      • 事实上,您的值中已经有映射,因此您可以使用
        进入
        添加到这些值中
      • 建立列表的一种理解方法
      • 按排序
        对最终结果进行排序

      我非常喜欢mobytes的回答。我为您提供了一个候补人选;)我真的很喜欢mobytes的回答。我为您提供了一个候补人选;)