给定一个嵌套集合,我想将它简化为只有形式为[_ D]的k-v对,其中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))
我很好奇是否可以在不使用可变状态的情况下这样做?
编辑原始功能不太正确。
答案 0 :(得分:1)
您的示例数据结构不是合法地图,所以我稍微改了一下:
(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])
您的要求有点模糊:您说“收藏”,但您的示例仅包含地图,因此我只需要猜测您的意图。