我有一组模拟数据,每组包含用户。这是我的数据:
(def group-list
[{:name "group1"
:id "group1"
:members [{:name "Bartek" :id "mem1"}
{:name "Quentin" :id "mem2"}]}
{:name "group2"
:id "group2"
:members [{:name "Bartek_test" :id "mem3"}
{:name "Quentin" :id "mem2"}]}
{:name "group3"
:id "group3"
:members [{:name "Bartek1" :id "mem1"}]}])
我想要做的是创建一个将用户id作为参数的函数,在group-list中搜索并返回完整记录。例如,如果id为mem2
,则方法应返回{:name "group2" :id "group2" :members [{:name "Bartek_test" :id "mem3"} {:name "Quentin" :id "mem2"}]}
我是clojure的新手,所以如果有人提出一些想法会很棒。谢谢
答案 0 :(得分:1)
(defn get-groups-by-member [member-id]
(filter (fn [x]
(some #(= member-id %)
(map #(get % :id)
(x :members))))
(get-group-list)))
答案 1 :(得分:0)
使用specter' select
,VAL
和ALL
的解决方案:
(require '[com.rpl.specter :refer [select ALL VAL]])
(defn find-groups [id]
(map first (select [ALL VAL :members ALL #(= (:id %) id)] group-list)))
(find-groups "mem2")
;; => ({:name "group1",
;; :id "group1",
;; :members [{:name "Bartek", :id "mem1"} {:name "Quentin", :id "mem2"}]}
;; {:name "group2",
;; :id "group2",
;; :members [{:name "Bartek_test", :id "mem3"} {:name "Quentin", :id "mem2"}]})
请注意,它会找到两个组,因为" mem1"属于" group1"和" group2"。