给定一个嵌套集合,我想将其简化为k-v对,这是表单_D,其中D是整数。例如,我想转换如下:
; Start with this ...
{:a {:val 1 :val 2} :b {:val 3 :c {:val 4}} :val 5}
; ... end with this
{:val 1, :val 2, :val 3, :val 4, :val 5}我编写了一个函数,使用postwalk,如下所示:
(defn mindwave-values [data]
(let [values (atom {})
integer-walk (fn [x]
(if (map? x)
(doseq [[k v] x]
(if (integer? v) (swap! values assoc k v)))
x))]
(postwalk integer-walk data)
@values))我很好奇,在不使用可变状态的情况下,是否可以做到这一点?
编辑原始函数不完全正确。
发布于 2013-04-28 20:43:15
您的示例数据结构不是合法的映射,所以我对它做了一些修改:
(defn int-vals [x]
(cond (map? x) (mapcat int-vals x)
(coll? x) (when (= 2 (count x))
(if (integer? (second x))
[x]
(int-vals (second x))))))
user> (int-vals {:a {:x 1 :y 2} :b {:val 3 :c {:val 4}} :val 5})
([:y 2] [:x 1] [:val 4] [:val 3] [:val 5])您的要求有点模糊:您说的是“集合”,但是您的示例只包含地图,所以我只能猜测您的意图。
https://stackoverflow.com/questions/16266894
复制相似问题