2016-05-31 26 views
1

多個字段我有這樣的:處理與地圖在Luminus公司/的Compojure

(defn my-page [] 
    (layout/render 
    "page1.html" ({:articles (map 
          #(update % :field1 (fn [d] (something....))) 
           (db/get-all-articles))}))) 
          ; how can I call map again to process other fields? 
          ; (map for :field2 .... ???? how?) 
          ; (map for :field3 .... ???? how?)  

我想預處理等領域也。我該如何正確地做到這一點?我的意思是,因爲我已經有變量:文章和功能圖, 我怎麼會再次映射其他領域,如:field2和field3?

回答

1

使用線程宏:

(def m {:field1 1 
     :field2 2 
     :field3 3}) 

(-> m 
    (update :field1 (fn [v1] ...)) 
    (update :field2 (fn [v2] ...)) 
    (update :field3 (fn [v3] ...))) 

它等同於:

(update 
    (update 
    (update m :field1 (fn [v1] ...)) 
    (fn [v2] ...)) 
    (fn [v3] ...)) 

您可以在一個功能附上這樣的邏輯,並用它所有的文章映射。

+0

有什麼'M'? db/get-all-articles'返回的是數據嗎? –

+0

這是一個示例地圖對象(例如您的文章數據)。 –

+0

是不是每次都創建一個新的數據結構?或者在這種情況下不可能避免它? –

1

你也可以概括這些更新與還原:

user> (def items {:field1 1 
        :field2 2 
        :field3 3}) 
#'user/items 
user> (reduce-kv update items {:field1 inc 
           :field2 dec 
           :field3 #(* % 2)}) 
{:field1 2, :field2 1, :field3 6}