假设我有一张这样的地图
{:a 1 :b 2 :c 3}
我想像这样映射(注意 - 非工作伪代码):
(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))
如果没有首先获取函数的键,映射它们并从函数中读回它,这是否可行?
我的问题是:如何在不知道Clojure中的键的情况下将地图解构为键值对?
答案 0 :(得分:6)
(seq {:a 1 :b 2 :c 3})
;([:a 1] [:b 2] [:c 3])
在地图上调用seq
会为您提供一系列键值对。 seq
调用通常是隐含的。
对
MapEntry
s,表现为成对。 因此
(type (first {:a 1 :b 2 :c 3}))
;clojure.lang.MapEntry
您的伪代码
(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))
......需要多次修理:
map
的集合
适用。MapEntry
拆分为一对即可获得
关键和价值。 map
代替mapcat
将功能应用于每对。
幸运的是mapcat
完全可以工作。 dorun
强制序列进行评估并将其丢弃
它就是这样。 REPL为你做前者,但是跑步
申请不需要。 这给了我们
(dorun
(map
(fn [[key-a value-a]] (println "key: " key-a " value: " value-a ))
{:a 1 :b 2 :c 3}))
打印
key: :a value: 1
key: :c value: 3
key: :b value: 2
...和返回 nil
。
答案 1 :(得分:3)
当你map
在地图上时,每个元素都是一个包含两个值的向量:键和值。你用这样的向量来构造每个元素:
(def m {:a 1 :b 2 :c 3})
(map (fn [[key value]] (str "key: " key " > value: " value-a)) m)
请注意,传递给map
的函数返回一个字符串值,而不是您对println
的调用,因为我们通过将函数应用于每个值来尝试转换传入的集合。您可以将map
返回的集合传递给prn
来调试该值,尽管REPL会为您打印出来。