1

给定一个嵌套集合,我想将其减少为仅 kv 对,其形式为 [_ 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))

我很好奇是否可以在不使用可变状态的情况下做到这一点?

编辑原来的功能不太正确。

4

1 回答 1

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

您的要求有点含糊:您说“收藏”,但您的示例仅包含地图,所以我只需要猜测您的意图。

于 2013-04-28T20:43:15.537 回答