我试图从复杂的列表结构中提取值.
鉴于这样的事情:
[{: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)
修复数据结构,一切都将落实到位.截至目前,您的数据结构根本不一致,这将使触及此数据的任何功能更加复杂且容易出错.您可以将此数据建模为地图:
(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)