Свести вложенную карту в список с помощью поиска в порядке глубины поиска
В ближайшем будущем, как я могу превратить вложенную карту следующим образом:
{"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")
2 ответа
Решение
Вот прямое итерационное решение (используя loop
а также 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)))))