sorting - 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 {}
为:
flatten
(将其转换为列表)apply hash-map
(其行为类似于into {}
)reduce hash-map
(它保留了顺序,但将每个地图深深地嵌套在一起)
那么,是否可以在保留结构的同时对地图进行排序?或者如何在保留返回的排序结构的同时转换回上述原始结构sort
?
解决方案
您可以使用优先级映射
(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"}}
推荐阅读
- java - 如何使用 Java 中的自定义异常处理多个枚举的无效数据行?
- c++ - 平凡可复制与可平凡复制
- javascript - Service Worker - 无法获取文件
- excel - 在 VF 页面中导出 Excel - 使用动态图像 URL 时图像未显示
- ansible - 如何使用ansible中的变量将文件复制到目的地?
- sql - 根据不存在于另一个表中删除表行,需要额外的“位置”
- reactjs - 为什么我的 'setInterval' 函数无法重复调用 'tick()' 函数?(反应.js)
- android - 为什么 SSLSocket 从 API 级别 16+ 开始支持 TLSv1.2 而从 API 级别 20+ 开始支持 SSLEngine?
- javascript - 分配给函数参数的属性(no-param-reassign)
- angular - 我试图在 github-pages 上部署我的 Angular 项目,突然错误说,无法获取 remote.origin.url