从Clojure中的复杂列表中提取值

Mik*_*ynn 3 clojure

我试图从复杂的列表结构中提取值.

鉴于这样的事情:

[{:a "whatever" :b [:c "foo"]} :e {:f "boo"} :g {:h [:i 62281]}]
Run Code Online (Sandbox Code Playgroud)

我想得到:

["whatever" "foo" "boo" 62281]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只是到了这一步:

((62281) nil (boo) nil whatever foo)
Run Code Online (Sandbox Code Playgroud)

这是代码:

(defn get-values [params]
  (apply conj
         (map (fn [part]
                (if (not (keyword? part))
                    (map (fn [v]
                           (if (vector? v)
                               (last v)
                               v))
                         (vals part))))
              params)))
Run Code Online (Sandbox Code Playgroud)
  1. 我似乎无法摆脱零
  2. 我无法弄清楚为什么某个点之后的值在列表中.
  3. 我认为必须有一个更好的方法来做到这一点.

Ank*_*kur 5

修复数据结构,一切都将落实到位.截至目前,您的数据结构根本不一致,这将使触及此数据的任何功能更加复杂且容易出错.您可以将此数据建模为地图:

(def data  {:a "whatever"
            :b nil
            :c "foo"
            :e nil
            :f "boo"
            :g nil
            :h nil
            :i 62281})
Run Code Online (Sandbox Code Playgroud)

然后获得所需的结果:

(->> (vals data)
     (filter (comp not nil?))
     (into []))
Run Code Online (Sandbox Code Playgroud)

但由于某些奇怪的原因,您仍然想要解析您提供的数据结构:

(defn get-values [data]
  (->> (map #(if (map? %) (into [] %) %)  data)
       flatten
       (filter #(or (string? %) (number? %)))
       (into [])))
Run Code Online (Sandbox Code Playgroud)