给定一个仅包含关键字键的嵌套映射,例如{:foo {:bar 1 :baz [2 3] :qux {:quux 4}} :corge 5}
,我该如何实施flatten-map
以便(flatten-map {:foo {:bar 1 :baz [2 3] :qux {:quux 4}} :corge 5} "-")
产生类似的东西{:foo-bar 1 :foo-baz [2 3] :foo-qux-quux 4 :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)))
正如你所看到的,我无法得到flatten-map
仅选择“叶子”。
(defn flatten-map
([form separator]
(into {} (flatten-map form separator nil)))
([form separator pre]
(mapcat (fn [[k v]]
(let [prefix (if pre (str pre separator (name k)) (name k))]
(if (map? v)
(flatten-map v separator prefix)
[[(keyword prefix) v]])))
form)))
即使要扩展值,您也无条件地创建新的键/值对,因此我将 map 切换为 mapcat,以便结果可以“包含”到顶层(这也需要拆分(into {} ...)
进入表单的顶级版本,因为除了输出的顶级之外,我们实际上不需要任何地图)。
以下是它如何与您的示例配合使用:
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}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)