在 clojure 中,我怎样才能像这样打开嵌套地图:
{"1" {"1.1" {"1.1.1" {}
"1.1.2" {}}
"1.2" {}}
"2" {"2.1" {}
"2.2" {}
"2.3" {}}}
进入这个:
("1" "1.1" "1.1.1" "1.1.2" "1.2" "2" "2.1" "2.2" "2.3")
在 clojure 中,我怎样才能像这样打开嵌套地图:
{"1" {"1.1" {"1.1.1" {}
"1.1.2" {}}
"1.2" {}}
"2" {"2.1" {}
"2.2" {}
"2.3" {}}}
进入这个:
("1" "1.1" "1.1.1" "1.1.2" "1.2" "2" "2.1" "2.2" "2.3")
这是一个简单的迭代解决方案(使用loop
and recur
):
(defn flatten-map [m]
(loop [in m out []]
(if-let [[[k v] & ts] (seq in)]
(recur (concat v ts)
(conj out k))
out)))
还有一个“花哨”的(使用tree-seq
功能)
(defn flatten-map [m]
(->> [nil m]
(tree-seq sequential? second)
(drop 1)
(map first)))
这是一个递归解决方案:
(defn flatten-map [m]
(flatten
(for [[k v] m]
(cons k (flatten-map v)))))