2011-04-19 83 views
6

今天下午我的大腦試圖弄清楚這一點。一般來說,我對Clojure和Lisp相當陌生。我有一個數據結構,它是一個地圖矢量,我希望將所有地圖中特定鍵的所有值都轉換爲另一個矢量。Clojure - 從hashmaps矢量中提取值

例如,讓我們說這是必然myvec會圖的矢量:

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

,我想,看起來像

[ "value1" "value3" ] 

由該鍵的所有值的矢量「KEY1」

我能想到的,做到這一點的唯一方法是

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

有沒有更簡單的方法?似乎必須有。

謝謝。

回答

17

(map #(get % "key1") myvec)應該是你所需要的。考慮使用:關鍵字而不是「字符串」作爲關鍵字,因爲它通常更好,更通俗。另外,然後你可以寫爲只是(map :key1 myvec)

+0

謝謝。正是我在找什麼。我正在將查詢中的鍵和值拉出來。我回到了「State:Closed」之類的東西,並且設置了一個像{「State」「Closed」}這樣的hashmap。這就是爲什麼我不使用:關鍵字。或者還有一些方法可以使用關鍵字? – 2011-04-20 00:07:31

+2

您可以使用'keyword'函數將字符串轉換爲關鍵字。不值得去做,如果你只在地圖上看過一次,但是例如'(into {}(for [[kv] mymap] [(keyword k)v]))會將地圖中的所有鍵轉換爲關鍵字(當前被認爲是字符串)。 – amalloy 2011-04-20 07:41:42

8
(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)))