2016-11-04 84 views
2

我有一組模擬的數據,每個組包含用戶。這裏是我的數據有:在clojure中過濾複雜的矢量

(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將是mem2方法應該返回{:name "group2" :id "group2" :members [{:name "Bartek_test" :id "mem3"} {:name "Quentin" :id "mem2"}]}

我是clojure的新手,所以如果有人提出一些想法,這將是非常好的。謝謝

+0

'mem2'看起來也在'group1'中。你想同時返回嗎? –

+0

是的,會很好 – fishera

+0

你到目前爲止做了什麼? –

回答

1
(defn get-groups-by-member [member-id] 
    (filter (fn [x] 
      (some #(= member-id %) 
        (map #(get % :id) 
         (x :members)))) 
      (get-group-list))) 
0

使用解決方案specterselectVALALL

(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」 是 「1組」 和 「組2」 的一部分。