Clojure:生成子地图中所有数据的列表

时间:2016-03-25 18:55:18

标签: clojure

我的数据结构如下:

(def data {:node {:subnode 'a}, :node2 {:subnode2 'b, :subnode3 'c} })

我想生成顶部节点(键)的值列表,即子节点(val),如下所示:

(:subnode 'a, :subnode2 'b, :subnode3 'c)

我该怎么做?几乎我迄今为止尝试过的所有东西都产生了:

({:subnode 'a} {:subnode2 'b, :subnode3 'c})

所有值都是分开的。

3 个答案:

答案 0 :(得分:2)

您只需提取每个顶级地图的值,然后提取flatten它:

(flatten (mapcat second data))

另外,为避免flatten进行深度肥胖(如Leon Grapenthin所述),您可以使用jmargolisvt提供的解决方案或使用concat

(apply concat (mapcat second data))

答案 1 :(得分:2)

如果conj map发送到user=> data {:node {:subnode a}, :node2 {:subnode2 b, :subnode3 c}} user=> (apply conj (map val data)) {:subnode a, :subnode2 b, :subnode3 c} ,您可以在一张地图中获取所有内容:

StreamingBody

答案 2 :(得分:0)

库函数vals用于收集所有地图的val,merge用于合并地图:

user> data
{:node {:subnode a}, :node2 {:subnode2 b, :subnode3 c}}
user> (apply merge (vals data))
{:subnode a, :subnode2 b, :subnode3 c}