2013-01-01 38 views
1

嵌套地图我有一个嵌套的地图看起来是这样的:转换Clojure中

{"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但我不能换我的头周围。

+0

我真的很喜欢mobytes的答案。我提供了一个替代你的乐趣;) – Kyle

回答

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"}) 
2

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

2

我建议是这样的:

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

这使得使用一些方便的技巧:

  • 解构打破我的地图进入[键值]对
  • 事实你已经有值的地图,所以你可以使用into添加到他们
  • A理解建立列表
  • sort-by排序最终结果