理想情况下,select-keys按键seq向量的顺序返回带有键的映射。但我发现只有当你的钥匙数量少于10时才会发生。
(def params {:resource-total-calls-abandoned 1, :resource-idle-time 5, :date "2016-12-31", :resource-wrap-up-time 1, :agent-talk-time 1, :resource-work-offers 3, :aux-in-time 1, :user-id 2183, :resource-not-ready-time 3, :split 1, :aux-out-time 1, :resource-logged-in-time 1, :hold-time 115, :acd-calls 1})
(select-keys params [:user-id
:date
:split
:resource-logged-in-time
:agent-talk-time
:resource-wrap-up-time
:hold-time
:acd-calls
:resource-total-calls-abandoned
])
这是我的结果:
{:user-id 2183, :date "2016-12-31", :split 1, :resource-logged-in-time 1, :agent-talk-time 1, :resource-wrap-up-time 1, :hold-time 115, :acd-calls 1, :resource-total-calls-abandoned 1}
如果我从一张巨大的地图中选择了10个以上的按键,地图的顺序将与按键的顺序不同
(select-keys params [:user-id
:date
:split
:resource-logged-in-time
:agent-talk-time
:resource-wrap-up-time
:hold-time
:acd-calls
:resource-total-calls-abandoned
:aux-in-time
])
结果会有所不同:
{:resource-total-calls-abandoned 1, :date "2016-12-31", :resource-wrap-up-time 1, :agent-talk-time 1, :aux-in-time 1, :user-id 2183, :split 1, :resource-logged-in-time 1, :hold-time 115, :acd-calls 1}
无论您想选择多少个键,还是按照keyseq向量的顺序返回带有键的地图的其他想法?
答案 0 :(得分:2)
如果你想要一个带有顺序的关联结构,有一个sorted-map
可以维持其元素的顺序。一个袖手旁观的解决方案可能是首先选择你想要的键,然后将它们放在一个新的有序地图中。
(def k [:user-id
:date
:split
:resource-logged-in-time
:agent-talk-time
:resource-wrap-up-time
:hold-time
:acd-calls
:resource-total-calls-abandoned
:aux-in-time])
(->> (select-keys params k)
(into (sorted-map-by #(< (.indexOf k %1) (.indexOf k %2)))))
上面的比较器函数#(< ...
只是一个例子;如果你以这种方式创建一个有序的地图,对它的更新(例如,assoc
)肯定会做错事。原因是向量k
中的索引用于比较元素的顺序,但对于不在向量中的任何元素,它是-1。
更有效的解决方案可能是将地图上的减少转换为已排序的数据结构。
更新:根据@leetwinski的建议,将apply
更改为into
,这样就无需在select-keys
之后展平地图。