2012-09-20 19 views
6

是否有解構鍵值對的方法?我有一個函數,它將map作爲參數,我想提取params本身的key和value的值。我怎麼做 ?如何將地圖解構爲鍵和值

我可以做與載體以下 -

((FN [[AB]](STR AB))[AB])

如何做相同/相似地圖 -

((FN [{KV}](STR KV)){KV})

謝謝, 穆爾塔扎

+0

我不知道安庫爾在說什麼,但試試這個http://stackoverflow.com/questions/12505603/how-to-destructure-a-map-as-key-and-value/12505893#12505893 – runexec

回答

16

函數圖拆解精氨酸名單是專爲從地圖中提取一定的鑰匙,並讓他們像這樣的名字:

core> (defn foo [{my-a :a my-b :b}] {my-a my-b}) 
core/foo                      
core> (foo {:a 1 :b 2}) 
{1 2} 

我建議this tutorial。要直接等價於((fn[{k v}] (str k v)) {k v})有點難,因爲地圖可能有許多鍵和許多值,所以解構代碼將無法分辨出您在哪裏尋找哪個鍵和值。按鍵解構更容易推理。

如果你想隨意選擇在地圖中的第一項,你可以提取並使用列表解構形式單一地圖項:

core> (defn foo [[k v]] {v k}) 
#'core/foo                      
core> (foo (first {1 2})) 
{2 1} 

在這個例子中,列表解構形式[k v]被使用,因爲首先將第一個映射條目作爲向量返回。

+0

將地圖值自動分配給與鍵名相對應的符號也是習慣和方便的。這是這樣寫的:'(defn foo [{:keys [a b]}](str a b))''。然後在函數調用:'(foo {:a 1:b 2})'。這將返回'「12」'。 –

+0

第二個示例在處理地圖中的所有鍵/值對時非常有用,因爲地圖的seq視圖是鍵/值對的列表。例如。 (map(fn [[kv]](println kv))my-map) – Alex

-3
user=> (for [x (hash-map :a 1 :b 2 :c 3)] (str (first x) " " (second x))) 
(":a 1" ":c 3" ":b 2") 
+0

問題是關於'解構map'而不是'concat集合的前2個元素' – Ankur

+0

他的上面的例子與我的代碼一起工作。 ..你能告訴我它不是嗎? – runexec

+0

示例代碼只是具有1個鍵值對的映射的示例,傳遞的映射有5個鍵/值對,您的代碼如何處理?例如:map {:name「superman」:age 1000:job「superhero」},現在我們需要解構所有三個鍵和它們的值......注意:解構不是手工提取的 – Ankur

2

有可供解構的地圖快捷鍵。例如,如果您正在查找特定的密鑰,則不必輸入name1:key1 name1:key2 ...

例如,

main=> (defn fbb [{:keys [foo bar baz]}] (+ foo bar baz)) 
#'main/fbb 
main=> (fbb {:foo 2 :bar 3 :baz 4}) 
9 

的,而不是...

(defn fbb [{foo :foo bar :bar baz :baz}] (+ foo bar baz)) 

如果地圖鍵是字符串,可以說:strs而不是:keys,如果他們是符號,您可以使用:syms