看一下这个例子:
(into [] (select-keys {:a 1 :b 2 :c 3} [:c :b])) => [[:c 3] [:b 2]]
是否保证返回的结果将保留在select-key
的第二个参数中声明的顺序?
答案 0 :(得分:7)
select-keys
会返回一个无序的地图,因此您无法依赖它。小地图表示为维持顺序的数组,但随着大小的增加而破坏,例如。
(def m {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9 :j 10 :k 11 :l 12 :m 13})
(into [] (select-keys m [:a :b :c :d :e :f :g :h :i :j :k]))
=> [[:e 5] [:k 11] [:g 7] [:c 3] [:j 10] [:h 8] [:b 2] [:d 4] [:f 6] [:i 9] [:a 1]]
答案 1 :(得分:1)
如果订购相当简单,您可以使用sorted-map-by
轻松对地图进行排序:
(def m (select-keys {:a 1 :b 2 :c 3 :d 4} [:d :b]))
=> {:d 4, :b 2}
(def sm (sorted-map-by compare))
(into sm m)
=> {:b 2, :d 4}
(assoc *1 :c 1234)
=> {:b 2, :c 1234, :d 4} ; maintains sort when additional kvs are assoc'd
(into [] *1)
=> [[:b 2] [:c 1234] [:d 4]]
即使排序不简单,您也可以编写自定义比较器。这充满了陷阱,但a guide非常好。这不是你原来所追求的,但它是相关的。
答案 2 :(得分:0)
保留订单不是一个可靠的功能,以及module _ where
和keys
不保留您定义地图的顺序。
如果您想输出kv(或vals
的有序向量),最可靠的方法是使用loop
/ recur
。
如果您只想要订购值,可以使用reduce
。
我想补充一点,实用的哈希图并不代表有序数据。