каков идиоматический способ нарезать карту в 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}])

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


person haijin    schedule 26.02.2013    source источник


Ответы (2)


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

(map #(-> % (dissoc :plays) 
            (assoc :rate 10)) plays)
person Ankur    schedule 26.02.2013

В зависимости от вашего варианта использования вы также можете найти 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}
person mtyaka    schedule 26.02.2013