2012-09-20 18 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