我正在尝试通过特定键从地图集合中提取一组值。例如,
输入:
[
{:k1 "v1" :k2 "v2" :k3 "v3"}
{:k1 "v4" :k2 "v2"}
]
Run Code Online (Sandbox Code Playgroud)
假设通过:k1,:k2获得一组值
所需的输出:
#{"v1" "v2" "v4"}
Run Code Online (Sandbox Code Playgroud)
所以我的解决方案是
(->> [{:k1 "v1" :k2 "v2" :k3 "v3"}
{:k1 "v4" :k2 "v2"}]
(map #(-> (select-keys % [:k1 :k2]) (vals) (set)))
(apply clojure.set/union))
Run Code Online (Sandbox Code Playgroud)
但是我想知道更好的方法。你怎么看?
使用into和传感器,我们可以执行以下操作:
(def input [{:k1 "v1" :k2 "v2" :k3 "v3"} {:k1 "v4" :k2 "v2"}])
(into #{} (mapcat (juxt :k1 :k2)) input) => #{"v4" "v1" "v2"}
Run Code Online (Sandbox Code Playgroud)
或者,我们可以使用cat和map代替的组成mapcat:
(into #{} (comp (map (juxt :k1 :k2)) cat) input) => #{"v4" "v1" "v2"}
Run Code Online (Sandbox Code Playgroud)