2016-11-04 81 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” 的一部分。