A version that I think is rather nicer, using for
instead of mapcat
:
(defn flatten-keys [m]
(if (not (map? m))
{[] m}
(into {}
(for [[k v] m
[ks v'] (flatten-keys v)]
[(cons k ks) v']))))
The function is naturally recursive, and the most convenient base case for a non-map is "this one value, with no keyseq leading to it". For a map, you can just call flatten-keys
on each value in the map, and prepend its key to each keyseq of the resulting map.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…