首页 > 解决方案 > Clojure: into {} 不保留排序顺序

问题描述

我有一个嵌套地图,其结构如下(Clojurescript):

{"6841"
 {"primaryTitle" "First name",
  "secondaryTitle" "last name"},
 "7944"
 {"primaryTitle" "Test 2 first name",
  "secondaryTitle" "Test 2 last name"}}

然后我继续使用嵌套地图中的键对地图进行排序,如下所示:

(defn compare-title [x y]
  (compare [(get (second x) "primaryTitle") (get (second x) "secondaryTitle")]
           [(get (second y) "primaryTitle") (get (second y) "secondaryTitle")]))

(sort compare-title @loaded-assets)

到目前为止,排序工作正常,但由于排序函数返回的数据结构如下:

    ["6841"
     {"primaryTitle" "First name",
      "secondaryTitle" "last name"}],
    ["7944"
     {"primaryTitle" "Test 2 first name",
      "secondaryTitle" "Test 2 last name"}]}

我必须使用into {}将地图转换回初始结构:

(into {} (sort compare-title my-map))

但这完全颠倒了按排序进行的排序。我试图替换 into {}为:

  1. flatten(将其转换为列表)
  2. apply hash-map(其行为类似于into {}
  3. reduce hash-map(它保留了顺序,但将每个地图深深地嵌套在一起)

那么,是否可以在保留结构的同时对地图进行排序?或者如何在保留返回的排序结构的同时转换回上述原始结构sort

标签: sortingclojureclojurescript

解决方案


您可以使用优先级映射

(use 'clojure.data.priority-map)

(defn compare-title [x y]
  (compare [(get x "primaryTitle") (get x "secondaryTitle")]
           [(get y "primaryTitle") (get y "secondaryTitle")]))

(apply priority-map-by compare-title
       ["7944"
        {"primaryTitle"   "Test 2 first name"
         "secondaryTitle" "Test 2 last name"}
        "6841"
        {"primaryTitle"   "First name"
         "secondaryTitle" "last name"}])

;; => {"6841" {"primaryTitle" "First name", "secondaryTitle" "last name"}, "7944" {"primaryTitle" "Test 2 first name", "secondaryTitle" "Test 2 last name"}}

推荐阅读