1

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

{"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这样的东西,但我无法绕过它。

4

3 回答 3

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"})
于 2013-01-01T17:04:26.883 回答
2

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

于 2013-01-01T21:28:42.780 回答
2

我建议像:

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

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

  • 解构以将 my-map 分解为 [key value] 对
  • 您已经在值中有映射的事实,因此您可以使用它into来添加它们
  • A for comprehension 构建列表
  • sort-by对最终结果进行排序
于 2013-01-02T00:00:33.123 回答