2014-11-29 5 views

ответ

1

Для подобных проблем, полезно иметь функцию полезности, которая может сопоставить по значениям в карте:

  • Clojure Cookbook определяет map-values на странице 100.
  • Clojure Программирование определяет map-map на стр. 88, который сохраняет тип карты.

следующее в месте

(defn map-map [f m] (into (empty m) (for [[k v] m] [k (f v)]))) 

и учитывая вашу карту

(def m '{:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n")]}) 

проблема сводится к тому, отображающая second функцию через элементы в каждой ценности в вашей карте:

(map-map #(mapv second %) m) 
;=> {:filter ["f1\n" "f2\n"], :mangle ["m1\n"]} 
+0

Thanx для указания правильного места поиска :-) – jerger

1

Это должно сделать трюк.

(def x '{:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n")]}) 

(reduce-kv #(assoc %1 %2 (mapv second %3)) {} x) 
;= {:mangle ["m1\n"], :filter ["f1\n" "f2\n"]} 

Хотя, кажется, что вы должны быть в состоянии избежать необходимости этого шага обработки, просто добавив "string" каждого вектор вместо добавления всего списка (:key "string"). Это, конечно, если у вас также есть функция, которая генерирует карту.

+0

Cool - works - теперь у меня есть look-upAndUn выискивать работу :-)) Many thanx ... вы сделали свой день :-) Относительно вашего совета: функция создания данных не моя, поэтому, к сожалению, я не влияю на структуру входных данных. – jerger

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