gpt4 book ai didi

join - 是否有 clojure 函数来 "join"两个映射列表?

转载 作者:行者123 更新时间:2023-12-02 00:31:55 25 4
gpt4 key购买 nike

我正在寻找一个类似于sql中的join的连接函数,例如:

这是两个 map 列表:

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

我想在 user_id 上加入 a 和 b 以获得:

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

clojure 或其他库中是否有一些函数可以实现此目的?

最佳答案

clojure.set/join会做这件事。

(require '[clojure.set :as set])

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

如果不提供第三个参数,函数将连接所有公共(public)键:

(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

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

仅在 id1 上加入 a 和 b:

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

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

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

关于join - 是否有 clojure 函数来 "join"两个映射列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com