通过特定键从地图集合中提取一组值

时间:2018-12-28 02:11:50

标签: clojure

我正在尝试通过特定键从地图集合中提取一组值。例如,

输入:

[
    {:k1 "v1" :k2 "v2" :k3 "v3"} 
    {:k1 "v4" :k2 "v2"}
]

假设通过:k1,,k2获得一组值

所需的输出:

#{"v1" "v2" "v4"}

所以我的解决方法是

(->> [{:k1 "v1" :k2 "v2" :k3 "v3"}
      {:k1 "v4" :k2 "v2"}]
     (map #(-> (select-keys % [:k1 :k2]) (vals) (set)))
     (apply clojure.set/union))

但是我想知道更好的方法。你觉得呢?

1 个答案:

答案 0 :(得分:4)

使用into和换能器,我们可以执行以下操作:

(def input [{:k1 "v1" :k2 "v2" :k3 "v3"} {:k1 "v4" :k2 "v2"}])
(into #{} (mapcat (juxt :k1 :k2)) input) => #{"v4" "v1" "v2"}

或者,我们可以使用catmap的组成代替mapcat

(into #{} (comp (map (juxt :k1 :k2)) cat) input) => #{"v4" "v1" "v2"}