2016-04-03 12 views
0

で、私は条件を追加するこのメイク連想ID条件付きのClojure

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

連想で場合のget-ルール-IDS nilを返すを行っていないように私は連想で作られました。私はwhen-letを追加しようとしましたが、エラーがありました。場合-てみましょう私は

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

を持ちたい

(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/publication {:publication/access nil}}) 
+3

map/assoc-inを実行する前に 'filter'でコレクションを渡し、' publication'情報を持たない 'books'を捨ててください。 'get-rules'とは何ですか? –

答えて

1

マックス

アマールのソリューションの作品が、それは、コレクションをプレフィルタリング対get-rules-idsを呼び出すのコストをクリアしていません。また、

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

コレクションのサイズがかなりなる可能性がある場合、変換器は、よりパフォーマンスのようになります。ここでは

は、後世のためにフィルタ処理オプションです。

1

一つの方法は、です。

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