繁体   English   中英

clojure 101将矢量组合成地图

[英]clojure 101 combining vectors into a map

我对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中丢失了一点。

试试这个:

(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}]

使用clojure.core/partial更优雅一点:

(map (partial zipmap keys) people)

正如Óscar建议的那样,你应该为你的keys使用不同的名字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM