如果我有这样的数组映射:
{"red" "blue"}
如何将其转换为如下数组:
["red" "blue"]
答案 0 :(得分:8)
地图包含一组无序的MapEntry对象,它们就像向量一样,所以只需先在地图上调用就会将其转换为序列,然后抓取第一个地图条目:
(first {"red" "blue"})
; ["red" "blue"]
答案 1 :(得分:1)
(vec (mapcat seq {"red" "blue"}))
; ["red" "blue"]
答案 2 :(得分:1)
user> (vec (apply concat {:a 0 :b 1 :c 2 :d 3}))
[:c 2 :b 1 :d 3 :a 0]
这与Thumbnail的解决方案类似,但调用seq是多余的。
还假设你的意思是矢量而不是数组。如果输出只是线性就足够了,那么也可以消除对vec的调用。
展平选项的问题在于地图中是否存在任何类型的内部结构:
user> (flatten (seq {:a 0 :b 1 :c [2 3]}))
(:c 2 3 :b 1 :a 0)
user> (apply concat {:a 0 :b 1 :c [2 3]})
(:c [2 3] :b 1 :a 0)
答案 3 :(得分:1)
如果您想将空地图作为空矢量处理,将多个地图作为[key val key val...]
的矢量处理,那么您可以使用reduce into []
或reduce-kv conj []
。
so.core=> (reduce into [] {"red" "blue"})
["red" "blue"]
so.core=> (reduce into [] {:a 0 :b 1 :c 2 :d 3})
[:c 2 :b 1 :d 3 :a 0]
so.core=> (reduce into [] {})
[]
答案 4 :(得分:0)
一种非常快捷的方法:
(flatten (vec {"red" "blue"}))
=> ("red" "blue")
如果你真的想要一个数组:
(into-array (flatten (vec {"red" "blue"})))
=> #<String[] [Ljava.lang.String;@4dc2753>
请记住,在Clojure中,[&#34; red&#34; &#34; blue&#34;]是一个向量,而不是一个数组。 {}表示地图。 Clojure首先创建一个数组映射,但稍后,它会在必要时将其提升为哈希映射。