Clojure - извлекает значения из вектора хеш-карт - PullRequest
8 голосов
/ 20 апреля 2011

Сегодняшний день ломает мне мозг, пытаясь понять это.Я довольно новичок в Clojure и Lisp в целом.У меня есть структура данных, которая является вектором карт, и я хочу получить все значения для определенного ключа из всех карт в другой вектор.

Например, предположим, что это вектор картпривязан к myvec:

[ { "key1" "value1" "key2" "value2"} {"key1" "value3" "key2" "value4"} ]

и я хочу вектор, который выглядит как

[ "value1" "value3" ]

, состоящий из всех значений ключа "key1"

Я мог бы подумать, чтобы сделать это:

(for [i (range (count(myvec)))] ((myvec i) "key1"))

Есть ли более простой способ?Кажется, что должно быть.

Спасибо.

Ответы [ 2 ]

20 голосов
/ 20 апреля 2011

(map #(get % "key1") myvec) должно быть все, что вам нужно. Попробуйте использовать: ключевые слова вместо «строк» ​​в качестве ключей, поскольку в целом это лучше и более идиоматично. Кроме того, вы могли бы написать это как (map :key1 myvec)

10 голосов
/ 20 апреля 2011
(let [v [{"key1" "value1", "key2" "value2"} {"key1" "value3", "key2" "value4"}]]
  (vec (map #(% "key1") v)))

Если вы используете ключевые слова для своих ключей:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"}]]
  (vec (map :key1 v)))

Если вы не хотите включать nil значения, когда карты не имеют заданного ключа:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"} {:key2 "value5"}]]
  (vec (keep :key1 v)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...