2015-08-27 29 views
2

我目前實施的方式,通過在地圖上像這樣深刻的鍵排序:Clojure的地圖解構一個鍵

(sort-by #(get-in % [:layer :order]) [{:layer {:order 1} {:layer {:order 2}]) 

我想知道是否有辦法做到這一點使用地圖解構?是否可用於let以外的功能和參數定義?我想知道的一個例子是可能的:

(sort-by {:layer {:order}} [{:layer {:order 1} {:layer {:order 2}]) 
+0

更多的排序來源將有所幫助。簡短的答案是**是**,也破壞了函數參數的作品。 –

+0

@FrankC。 [sort-by](https://clojuredocs.org/clojure.core/sort-by)函數是clojure.core庫中的一個。 –

+0

啊,mea culpa。 @ birdspider有你的直接答案。 –

回答

0

我不這麼認爲,因爲排序按需要的值提取功能(keyfn)

(即除非你想條目進行排序直接自理)

user=> (doc sort-by) 
------------------------- 
clojure.core/sort-by 
([keyfn coll] [keyfn comp coll]) 
Returns a sorted sequence of the items in coll, where the sort 
order is determined by comparing (keyfn item). If no comparator is 
supplied, uses compare. comparator must implement 
java.util.Comparator. If coll is a Java array, it will be modified. 
To avoid this, sort a copy of the array. 

編輯:你可以做的是「模擬」通過撰寫和關鍵字查找get-in

(sort-by (comp :a :c) [ {:c {:a 3}} {:c {:a 2}} ])

+0

啊我明白了。感謝您的澄清! –

1

據我所知,只能在let綁定或函數綁定中解構。這是你怎麼可能做到與嵌套地圖解構:

(sort-by (fn [{{o :order} :layer}] o) 
     [{:layer {:order 2}} 
      {:layer {:order 1}}]) 

雖然我不認爲這是更清晰。由於關鍵字是函數,因此您還可以使用普通的舊函數組合:

(sort-by (comp :order :layer) 
     [{:layer {:order 2}} 
      {:layer {:order 1}}])