2013-01-01 29 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排序最終結果