我正试图从复杂的列表结构中提取值。
考虑到这样的事情:
[{:a "whatever" :b [:c "foo"]} :e {:f "boo"} :g {:h [:i 62281]}]
我想得到:
["whatever" "foo" "boo" 62281]
到目前为止,我只是到了这一点:
((62281) nil (boo) nil whatever foo)
以下是代码:
(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)))
答案 0 :(得分:5)
修复数据结构,一切都将落实到位。截至目前,您的数据结构根本不一致,这将使触及此数据的任何功能更加复杂且容易出错。您可以将此数据建模为地图:
(def data {:a "whatever"
:b nil
:c "foo"
:e nil
:f "boo"
:g nil
:h nil
:i 62281})
然后获得所需的结果:
(->> (vals data)
(filter (comp not nil?))
(into []))
但是由于一些奇怪的原因,你仍然想要解析你提供的数据结构:
(defn get-values [data]
(->> (map #(if (map? %) (into [] %) %) data)
flatten
(filter #(or (string? %) (number? %)))
(into [])))