迭代嵌套映射的所有键

Clo*_*tly 3 clojure

鉴于:

{:o {:i1 1
     :i2 {:ii1 4}}}
Run Code Online (Sandbox Code Playgroud)

我想从根作为向量以“绝对”形式迭代地图的键。所以我想:

{
 [:o :i1] 1
 [:o :i2 :ii1] 4
}
Run Code Online (Sandbox Code Playgroud)

作为结果。基本上只得到叶节点。

ama*_*loy 5

我认为更好的版本,使用for而不是mapcat

(defn flatten-keys [m]
  (if (not (map? m))
    {[] m}
    (into {}
          (for [[k v] m
                [ks v'] (flatten-keys v)]
            [(cons k ks) v']))))
Run Code Online (Sandbox Code Playgroud)

该函数自然是递归的,非映射最方便的基本情况是“这个值,没有keyeq 导致它”。对于映射,您可以调用flatten-keys映射中的每个值,并将其键添加到结果映射的每个键序列中。