2016-05-31 20 views
1

Ich habe dies:Verarbeitung mehr Felder mit Karte in 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?)  

ich auch vorverarbeitet andere Bereiche will. Wie kann ich das richtig machen? Ich meine, da ich bereits die Variable Artikel- und Funktionskarte habe, Wie würde ich wieder für andere Felder wie Feld2 und Feld3 zuordnen?

Antwort

1

ein Threading-Makro verwenden:

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

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

Es ist äquivalent zu:

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

Sie eine solche Logik in einer Funktion umschließen kann und es verwenden, alle Artikel zu kartieren.

+0

was ist das 'm'? Sind es Daten, die 'db/get-all-articles' zurückgibt? –

+0

Es ist ein Beispiel für ein Kartenobjekt (z. B. mit Ihren Artikeldaten). –

+0

erstellt es nicht jedes Mal eine neue Datenstruktur? oder ist es unmöglich, es in diesem Fall zu vermeiden? –

1

Sie könnten auch dieses Updates mit Reduktion verallgemeinern:

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}