在clojure中有条件地进行收集的关联

时间:2016-04-03 21:52:05

标签: clojure

我像这样做了联合

(defn process-pubaccess-nb [conn books]
  (map #(assoc-in % [:book/publication :publication/access] (get-rules-ids % conn) ) books)
  )

如果 get-rules-ids 返回nil,我想添加条件 assoc-in 。我试图添加when-let,但我有错误。

例如,如果我得到

(def lib [{:book/name "one" :book/pid "1" :book/publication {:publication/pid "11"} }
          {:book/name "two" :book/pid "2":book/publication {:publication/pid "22"} }
          {:book/name "three" :book/pid "3" }])

我想要

    ({:book/name "one", :book/pid "1", :book/publication {:publication/pid "11", :publication/access "test"}} 
{:book/name "two", :book/pid "2", :book/publication {:publication/pid "22", :publication/access "test"}} 
{:book/name "three", :book/pid "3"})

现在我没有条件

({:book/name "one", :book/pid "1", :book/publication {:publication/pid "11", :publication/access "test"}} 
{:book/name "two", :book/pid "2", :book/publication {:publication/pid "22", :publication/access "test"}} 
{:book/name "three", :book/pid "3", :book/publication {:publication/access nil}}) 

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用if-let。

(defn process-pubaccess-nb
  [conn books]
  (map #(if-let [access (get-rules-ids % conn)]
          (assoc-in % [:book/publication :publication/access] access)
          %)
       books))

答案 1 :(得分:1)

Maxx的

Amar的解决方案有效,但不清楚调用get-rules-ids与预过滤集合的成本。

以下是后代的过滤选项:

    (defn process-pubaccess-nb 
      [conn books]
        (map #(assoc-in % [:book/publication :publication/access] (get-rules-ids % conn)) 
            (filter :book/publication books)))

另外,如果收集的尺寸可能相当大,那么换能器的性能可能会更高。