Clojure 通过连接关键点展平地图
给定一个只有关键字键的嵌套映射,例如Clojure 通过连接关键点展平地图,clojure,Clojure,给定一个只有关键字键的嵌套映射,例如{:foo{:bar 1:baz[23]:qux{:quoux4}}:corge 5},我如何实现展平映射,从而(展平映射{:foo{:bar 1:baz[23]:qux4}:corge 5}“-生成类似于{:foo-bar 1:foobaz[23]:fooqux4:corge 5}的东西 我最好的尝试是: (defn flatten-map ([form separator] (flatten-map form separator nil)) ([f
{:foo{:bar 1:baz[23]:qux{:quoux4}}:corge 5}
,我如何实现展平映射
,从而(展平映射{:foo{:bar 1:baz[23]:qux4}:corge 5}“-
生成类似于{:foo-bar 1:foobaz[23]:fooqux4:corge 5}的东西
我最好的尝试是:
(defn flatten-map
([form separator] (flatten-map form separator nil))
([form separator prefix]
(if (map? form)
(into {} (map (fn [[k v]]
[(keyword (str prefix (name k)))
(flatten-map v separator (str prefix (name k) separator))])
form))
form)))
正如您所看到的,我无法使用展平贴图
仅选择“叶子”
您正在无条件地创建新的键/值对,即使要扩展值,所以我将map切换到mapcat,以便将结果“包含”到顶层(这也需要将(拆分为{}…)
转换为表单的顶级版本,因为除了输出的顶级之外,我们实际上不需要任何地图)
下面是它如何与您的示例配合使用:
user> (flatten-map {:foo {:bar 1 :baz [2 3] :qux {:quux 4}} :corge 5} "-")
{:foo-bar 1, :foo-qux-quux 4, :foo-baz [2 3], :corge 5}
user> (flatten-map {:foo {:bar 1 :baz [2 3] :qux {:quux 4}} :corge 5} "-")
{:foo-bar 1, :foo-qux-quux 4, :foo-baz [2 3], :corge 5}