2013-02-26 4 views
5

Для списков и векторов мы можем отрезать последовательность и взять любую часть, которую мы хотим. Как сделать аналогичные операции для отображения объектов?Что такое идиоматический способ разрезать карту в Clojure?

К примеру, у меня есть список объектов на карте,

(def plays [ 
     {:name "Burial",  :plays 979, :loved 9} 
     {:name "Eno",  :plays 2333, :loved 15} 
     {:name "Bill",  :plays 979, :loved 9} 
     {:name "Magma",  :plays 2665, :loved 31}]) 

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

ответ

17

assoc и dissoc ваши друзья в этом случае:

(map #(-> % (dissoc :plays) 
      (assoc :rate 10)) plays) 
+0

Terse and to смысл. Просто. Красивый. – omiel

13

В зависимости от вашего потребительной случае, вы можете также найти select-keys полезным в дополнение к assoc и dissoc:

clojure.core/select-keys 
([map keyseq]) 
    Returns a map containing only those entries in map whose key is in keys 
(select-keys {:name "Eno" :plays 2333 :loved 15} [:name :loved]) 
;; => {:name "Eno" :loved 15} 
Смежные вопросы