如何将地图解构为关键和价值

时间:2012-09-20 03:11:19

标签: clojure

有没有办法去构建一个键值对?我有一个函数,它将map作为参数,我想在params本身中提取key和value的值。我怎么做 ?

我可以使用矢量 -

执行以下操作
  

((fn [[a b]](str a b))[a b])

我如何使用map -

执行相同/类似操作
  

((fn [{k v}](str k v)){k v})

谢谢, 穆尔塔扎

3 个答案:

答案 0 :(得分:19)

函数中的映射解析arg列表用于从映射中提取某些键并给出它们的名称,如下所示:

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],因为first首先将第一个映射条目作为向量返回。

答案 1 :(得分:2)

有可用于解构地图的快捷方式。例如,如果您要查找特定键,则不必键入name1:key1 name1:key2 ...

e.g。

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

答案 2 :(得分:-3)

user=> (for [x (hash-map :a 1 :b 2 :c 3)] (str (first x) " " (second x)))
(":a 1" ":c 3" ":b 2")
相关问题