3

特定の「columnId」を指定して「field」の値を取得するマップのリストがあります。

(def field-to-column-mapping
   [{"field" "first_name", "columnId" "1"}
    {"field" "last_name", "columnId" "2"}
    {"field" "phone", "columnId" "3"}])


(defn get-field-given-column [id]
  ((some #(if (= id (get % "columnId")) %)
         field-to-column-mapping)
   "field"))

 ;; Gets "first_name"
 (get-field-given-column "1")

これは機能しますが、それを行うためのよりクリーンな方法が必要であると私の腸は教えてくれます。

それを行うより良い方法はありますか?

4

2 に答える 2

5

a を使用してこれをfor記述すると、質問の例と本質的に同じことを行いながら、おそらく少し明確になります。

(defn get-field-given-column [id] 
   (for [row field-to-column-mapping :when (= (row "columnId") id)] 
      (row "field")))

> (get-field-given-column "1")
("first_name")

複数の行が同じキーを持つ可能性があるため、これは一連の回答を返します。本当に 1 つしかない場合は、 への呼び出しを追加しますfirst

于 2012-09-05T15:20:29.913 に答える
4

を変更せずに多くのルックアップを行っている場合は、マップをfield-to-column-mapping構築する価値があるかもしれません。"columnId" -> "field"

(def column-to-field
   (zipmap
     (map #(% "columnId") field-to-column-mapping)
     (map #(% "field") field-to-column-mapping)))
; {"3" "phone", "2" "last_name", "1" "first_name"}

定義する別の方法column-to-fieldは次のとおりです(どちらの方法がより優れているか、より効率的かはわかりません):

(def column-to-field
   (apply hash-map
      (mapcat
         #(vector (% "columnId") (% "field"))
         field-to-column-mapping)))

(column-to-field "1")これで、目的の結果が得られます。

于 2012-09-05T15:19:57.560 に答える