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

时间:2013-03-14 01:45:09

标签: clojure

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

考虑到这样的事情:

[{: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)))
  1. 我似乎无法摆脱nil的
  2. 我无法弄清楚为什么某个点之后的值在列表中。
  3. 我认为必须有更好的方法来做到这一点。

1 个答案:

答案 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 [])))