2015-08-27 27 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}}])