"сплющить" список карт в одну карту в clojure? - PullRequest
2 голосов
/ 27 февраля 2020

Я хочу go из этого списка карт, возвращаемых запросом jdb c:

'({:series_id 1 :expires_at "t1"} {:series_id 2 :expires_at "t2"})

на одну карту, например:

{1 "t1" 2 "t2"}

Это так Я могу посмотреть expires_at, используя просто series_id целое число.

Я получил:

db.core=> (mapcat #((comp vals select-keys) %1 [:series_id :expires_at]) 
                  '({:series_id 1, :expires_at "t1"} {:series_id 2 :expires_at "t2"}))
(1 "t1" 2 "t2")

, но это список, а не карта.

Интересно, является ли это кандидатом на понижение и / или есть ли другие хитрые способы сделать это.

Ответы [ 2 ]

7 голосов
/ 27 февраля 2020

Вы можете преобразовать каждую карту в пару [series_id expires_at], а затем преобразовать соответствующие последовательности пар в карту:

(def l '({:series_id 1 :expires_at "t1"} {:series_id 2 :expires_at "t2"}))
(into {} (map (juxt :series_id :expires_at) l))
3 голосов
/ 28 февраля 2020

С другой стороны, с пониманием и деструктуризацией списка

(defn flatten-expiration-data [the-maps]
 (into {}
  (for [{id :series_id expiration :expires_at} the-maps]
    [id expiration])))

Это более многословно, чем ответ @ Lee, но я надеюсь, что это также поможет читателям выучить язык!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...