clojure 101将矢量组合成地图

roo*_*top 5 lisp functional-programming vector clojure map

我对Clojure很新,似乎无法找到一种方法来做一些我确定无关紧要的事情.我看过这个assoc函数,因为我认为这可能是答案,但不能让它起作用.

是)我有的:

keys => [:num, :name, :age]
people =>  [ [1, "tim", 31] [2, "bob" 33] [3, "joe", 44] ]
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建一个地图矢量,每个地图看起来像

[ { :num 1, :name "tim", :age 31 } 
  { :num 2, :name "bob", :age 33 } 
  { :num 3, :name "joe", :age 44 } ]
Run Code Online (Sandbox Code Playgroud)

我的OO大脑要我写一堆循环,但我知道有一个更好的方法我只是在大API中丢失了一点.

Ósc*_*pez 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})
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的ks不是keys命名键,而是keysClojure中的内置过程,重新定义它是个坏主意.还要注意map返回一个懒惰的序列; 如果你绝对需要一个矢量,那么这样做:

(vec (map #(zipmap ks %) people))

=> [{:num 1, :name "tim", :age 31}
    {:num 2, :name "bob", :age 33}
    {:num 3, :name "joe", :age 44}]
Run Code Online (Sandbox Code Playgroud)