3

我正在尝试将值从复杂的列表结构中提取出来。

鉴于这样的事情:

[{: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. 我认为必须有更好的方法来做到这一点。
4

1 回答 1

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 [])))
于 2013-03-14T04:24:55.480 回答