2013-04-28 35 views
1

給定一個嵌套集合我想減少它僅是形式爲[_ d]其中d是整數第k-V對。比如我想改變如下:如何減少不使用可變狀態嵌套集合?

; 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)) 

我很好奇,如果有可能做到這一點,而無需使用可變的狀態?

編輯原有的功能是不完全正確。

回答

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]) 

你的要求是有點含糊:你說的「收藏」,但你的例子只包含地圖,所以我只能猜測你的意圖。

+0

我喜歡這個。我在發佈答案的同時更新了我的問題 - 對此感到抱歉。儘管如此,你的回答告訴我如何做到沒有狀態。謝謝。 – 2013-04-28 20:47:48