有没有办法去构建一个键值对?我有一个函数,它将map作为参数,我想在params本身中提取key和value的值。我怎么做 ?
我可以使用矢量 -
执行以下操作((fn [[a b]](str a b))[a b])
我如何使用map -
执行相同/类似操作((fn [{k v}](str k v)){k v})
谢谢, 穆尔塔扎
答案 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")