Преобразование вектора карт к карте карт в Clojure

У меня есть вектор карт как это:

[{:categoryid 1, :categoryname "foo" } 
 {:categoryid 2, :categoryname "bar" } 
 {:categoryid 3, :categoryname "baz" }]

и хотел бы генерировать карту карт как это для поиска categoryname

{"foo" {:categoryid 1, :categoryname "foo" }, 
 "bar" {:categoryid 2, :categoryname "bar" }, 
 "baz" {:categoryid 3, :categoryname "baz" }}

Как я могу сделать это?

9
задан Dave Liepmann 12 June 2015 в 15:30
поделиться

3 ответа

(reduce (fn [m {catname :categoryname :as input}]
          (assoc m catname input))
        {}
        [{:categoryid 1, :categoryname "foo" } 
         {:categoryid 2, :categoryname "bar" } 
         {:categoryid 3, :categoryname "baz" }])

Еще лучше,

(#(zipmap (map :categoryname %) %)
 [{:categoryid 1, :categoryname "foo" } 
  {:categoryid 2, :categoryname "bar" } 
  {:categoryid 3, :categoryname "baz" }])
10
ответ дан 4 December 2019 в 08:32
поделиться
(ns code.groupby
  (:use clojure.contrib.seq-utils))


(def vector-of-maps [ {:categoryid 1, :categoryname "foo" }
                      {:categoryid 2, :categoryname "bar" }
                      {:categoryid 3, :categoryname "baz" } ])

(group-by :categoryname vector-of-maps)

Дает вам карту векторов карт

{"bar" [{:categoryid 2, :categoryname "bar"}],
 "baz" [{:categoryid 3, :categoryname "baz"}],
 "foo" [{:categoryid 1, :categoryname "foo"}]}

(теперь я понимаю, что это не то, что вы хотели... извините)

1
ответ дан 4 December 2019 в 08:32
поделиться

Другой способ: (into {} (map (juxt :categoryname identity) [...]))

14
ответ дан 4 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: