Преобразование вектора карт в карту карт в Clojure - PullRequest
9 голосов
/ 16 июня 2010

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

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

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

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

Как мне это сделать?это?

Ответы [ 4 ]

14 голосов
/ 16 июня 2010

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

10 голосов
/ 16 июня 2010
(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" }])
1 голос
/ 16 июня 2010
(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"}]}

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

0 голосов
/ 29 октября 2016

Я не тестировал его в Clojure, но в ClojureScript этот вариант выглядит быстрее других:

(reduce #(assoc %1 (:categoryname %2) %2) {} [...])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...