2016-05-31 5 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} 

 Смежные вопросы

  • Нет связанных вопросов^_^