【问题标题】:converting nested maps in clojure在 clojure 中转换嵌套映射
【发布时间】:2013-01-01 16:44:29
【问题描述】:

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

{"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 之类的东西,但我无法理解它。

【问题讨论】:

  • 我真的很喜欢 mobytes 的回答。我为您提供了一个替代方案;)

标签: map clojure traversal


【解决方案1】:
(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).

    【讨论】:

      【解决方案3】:

      我建议如下:

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

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

      • 解构以将 my-map 分解为 [键值] 对
      • 事实上您已经在值中有映射,因此您可以使用into 来添加它们
      • 理解构建列表
      • sort-by 对最终结果进行排序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多