vet*_*yan 1 sorting clojure clojurescript
我有一个嵌套的地图,其结构如下(Clojurescript):
{"6841"
{"primaryTitle" "First name",
"secondaryTitle" "last name"},
"7944"
{"primaryTitle" "Test 2 first name",
"secondaryTitle" "Test 2 last name"}}
Run Code Online (Sandbox Code Playgroud)
然后,我使用嵌套地图内的键对地图进行排序,如下所示:
(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)
Run Code Online (Sandbox Code Playgroud)
到目前为止,排序工作正常,但由于排序功能返回的数据结构如下:
["6841"
{"primaryTitle" "First name",
"secondaryTitle" "last name"}],
["7944"
{"primaryTitle" "Test 2 first name",
"secondaryTitle" "Test 2 last name"}]}
Run Code Online (Sandbox Code Playgroud)
我必须使用into {}将地图转换回初始结构:
(into {} (sort compare-title my-map))
Run Code Online (Sandbox Code Playgroud)
但这完全颠倒了按排序进行的排序。我尝试替换 into {}为:
flatten (将其转换为列表)apply hash-map(其行为类似于into {})reduce hash-map (这会保留顺序,但会将每个地图深深地嵌套在一起)那么,可以在保留结构的同时对地图进行排序吗?或者如何在保留由返回的排序结构的同时转换回上述原始结构sort?
小智 6
您可以使用优先级图
(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"}}
Run Code Online (Sandbox Code Playgroud)