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 に答える