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}