在Clojure中对地图矢量进行排序和排序的更清洁方法?

Jes*_*son 1 clojure clojurescript

我有一个地图矢量,其中我需要删除名称键的值是重复的地图,保持具有最高年龄值的地图.我有一个解决方案,但我认为它看起来不干净.有没有更好的方法来实现它而不将其分解为多个功能?

这是我的数据:

(def my-maps
    [{:name "jess", :age 32} 
     {:name "ruxpin", :age 4} 
     {:name "jess", :age 35} 
     {:name "aero", :age 33} 
     {:name "banner", :age 4}])
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案:

(map first (vals (group-by :name (reverse (sort-by :name my-maps)))))
Run Code Online (Sandbox Code Playgroud)

结果:

({:name "ruxpin", :age 4} {:name "jess", :age 35} {:name "banner", :age 4} {:name "aero", :age 33})
Run Code Online (Sandbox Code Playgroud)

lee*_*ski 5

另一种方式是组合group-bymax-key.这种方法的优点是您不需要对集合进行排序sort,反过来又会对性能产生影响,如果可以避免,则应该这样做.

(for [[_ vs] (group-by :name my-maps)]
  (apply max-key :age vs))

;;=> ({:name "jess", :age 35} 
;;    {:name "ruxpin", :age 4} 
;;    {:name "aero", :age 33} 
;;    {:name "banner", :age 4})
Run Code Online (Sandbox Code Playgroud)