有没有clojure函数来“加入”两个地图列表? [英] Is there a clojure function to "join" two list of maps?

查看:84
本文介绍了有没有clojure函数来“加入”两个地图列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一个连接函数,就像加入sql,例如:



这里是两个地图列表:

 (def a [{:user_id 1:nameuser 1} 
{:user_id 2:nameuser 2}])

(def b [{:user_id 2:emaile 2}
{:user_id 1:emaile 1}])
/ pre>

我想在user_id上加入a和b:

  [{:user_id 1:nameuser 1:emaile 1} 
{:user_id 2:nameuser 2:emaile 2}]

在clojure或其他库中可以实现这个功能吗?

解决方案

clojure.set / join 会做这件事。

 (使用'clojure.set)

(clojure.set / join a b); => #{{:emaile 1,:nameuser 1,:user_id 1} {:emaile 2,:nameuser 2,:user_id 2}}



不提供第三个参数,函数将在所有公共键上加入:

 (def a [{:id1 1:id2 2:namen 1} {:id1 2:id2 3:namen 2}])
:id1 1:id2 2:urlu 1} {:id1 2:id2 4:urlu 2}])
(def c [{:id1 1:id2 2:urlu 1 } {:id1 2:urlu 2}]); :第二条记录中缺少id2

(clojure.set / join a b); #{{:namen 1,:urlu 1,:id1 1,:id2 2}}
(clojure.set / join a c); #{{:namen 2,:urlu 2,:id1 2,:id2 3} {:namen 1,:urlu 1,:id1 1,:id2 2}}

仅在id1上加入a和b:

 (clojure.set / join ab {:id1:id1}); #{{:namen 2,:urlu 2,:id1 2,:id2 4} {:namen 1,:urlu 1,:id1 1,:id2 2}} 

我们甚至可以通过不同的集合加入不同的集合:

 (clojure.set / join ab {:id1:id2}); #{{:namen 2,:urlu 1,:id1 1,:id2 2}} 


I am looking for a join function which is like join in sql,for example:

Here is two list of maps:

(def a [{:user_id 1 :name "user 1"} 
        {:user_id 2 :name "user 2"}])

(def b [{:user_id 2 :email "e 2"} 
        {:user_id 1 :email "e 1"}])

I want join a and b on user_id to get:

[{:user_id 1 :name "user 1" :email "e 1"} 
 {:user_id 2 :name "user 2" :email "e 2"}]

Is there some function in clojure or other library which could achieve this?

解决方案

clojure.set/join will do the thing.

(use 'clojure.set)

(clojure.set/join a b) ; => #{{:email "e 1", :name "user 1", :user_id 1} {:email "e 2", :name "user 2", :user_id 2}}

Without providing 3rd argument, function will join on all common keys:

(def a [{:id1 1 :id2 2 :name "n 1"} {:id1 2 :id2 3 :name "n 2"}])
(def b [{:id1 1 :id2 2 :url "u 1"} {:id1 2 :id2 4 :url "u 2"}])
(def c [{:id1 1 :id2 2 :url "u 1"} {:id1 2 :url "u 2"}]) ; :id2 is missing in 2nd record

(clojure.set/join a b) ; #{{:name "n 1", :url "u 1", :id1 1, :id2 2}}
(clojure.set/join a c) ; #{{:name "n 2", :url "u 2", :id1 2, :id2 3} {:name "n 1", :url "u 1", :id1 1, :id2 2}}

To join a and b only on id1:

(clojure.set/join a b {:id1 :id1}) ; #{{:name "n 2", :url "u 2", :id1 2, :id2 4} {:name "n 1", :url "u 1", :id1 1, :id2 2}}

We can even join by different keys from different collections:

(clojure.set/join a b {:id1 :id2}) ; #{{:name "n 2", :url "u 1", :id1 1, :id2 2}}

这篇关于有没有clojure函数来“加入”两个地图列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆