我对Clojure很新,似乎无法找到一种方法来做一些我确定无关紧要的事情。我已经查看了assoc
函数,因为我认为这可能是答案,但无法使其正常工作。
我有什么:
keys => [:num, :name, :age]
people => [ [1, "tim", 31] [2, "bob" 33] [3, "joe", 44] ]
我想要做的是创建一个地图矢量,每个地图看起来像
[ { :num 1, :name "tim", :age 31 }
{ :num 2, :name "bob", :age 33 }
{ :num 3, :name "joe", :age 44 } ]
我的OO大脑要我写一堆循环,但我知道有一种更好的方法我只是在大API中丢失了一些。
答案 0 :(得分:10)
试试这个:
(def ks [:num :name :age])
(def people [[1 "tim" 31] [2 "bob" 33] [3 "joe" 44]])
(map #(zipmap ks %) people)
=> ({:num 1, :name "tim", :age 31}
{:num 2, :name "bob", :age 33}
{:num 3, :name "joe", :age 44})
请注意,我使用ks
代替keys
来命名密钥,因为keys
是Clojure中的内置过程,重新定义它是个坏主意。还要注意map
返回一个惰性序列;如果你绝对需要一个矢量,那么这样做:
(vec (map #(zipmap ks %) people))
=> [{:num 1, :name "tim", :age 31}
{:num 2, :name "bob", :age 33}
{:num 3, :name "joe", :age 44}]
答案 1 :(得分:1)