2014-01-16 51 views
0

我有一个向量的结构是这样的...Clojure的地图筑巢

[{:email "[email protected]", :password "pass"} 
{:email "[email protected]", :password "pass2"} 
{:email "[email protected]", :password "pass3"} 
{:email "[email protected]", :password "pass4"}] 

我怎样才能使一个映射出这个会是这样?这两个电子邮件的值必须相同...

{{"[email protected]"{:email "[email protected]", :password "pass"}}, 
    {"[email protected]"{:email "[email protected]", :password "pass2"}}, 
    {"[email protected]" {:email "[email protected]", :password "pass3"}} , 
    {"[email protected]"{:email "[email protected]", :password "pass4"}}  

我对clojure有点新,所以任何帮助表示赞赏。

回答

3
(def a [{:email "[email protected]", :password "pass"} 
     {:email "[email protected]", :password "pass2"} 
     {:email "[email protected]", :password "pass3"} 
     {:email "[email protected]", :password "pass4"}]) 

(zipmap (map :email a) a) 

创建电子邮件地址的序列,然后该拉链和原始地图的矢量与所述地址作为密钥和原地图作为值的新地图。

(认为电子邮件的左侧,右侧和拉链竖直呈现原始地图项垂直显示的列表中向下移动一起加入他们)

+0

谢谢你,正是我所需要的。 – Shile

+0

我怎么能添加一个函数的所有值:password关键字?我试图合并(creds/hash-bcrypt“密码的字符串/值”)函数。 – Shile

+0

如果您要求如何转换与密码相关的值,那么如果密钥已存在,assoc会“覆盖”。例如(zipmap(地图:电子邮件a)(地图#(关联%:密码(关键字(:密码%)))a))将字符串转换为关键字 – status203

0

另一种选择(虽然你的输出将被嵌套在矢量)是使用group-by

user=> (def a [{:email "[email protected]", :password "pass"} 
     {:email "[email protected]", :password "pass2"} 
     {:email "[email protected]", :password "pass3"} 
     {:email "[email protected]", :password "pass4"}]) 
#'user/a 
user=> (group-by :email a) 
{"[email protected]" [{:email "[email protected]", :password "pass"}], "[email protected]" [{:email "[email protected]", :password "pass2"}], "[email protected]" [{:email "[email protected]", :password "pass3"}], "[email protected]" [{:email "[email protected]", :password "pass4"}]} 
user=> 
+0

整洁的解决方案,但我需要它是地图... status203回答了我的问题,但无论如何谢谢你。 – Shile

+0

虽然'(map(fn [[k [v]]] {k v})(group-by:email a))很容易修复' – dsm