3

我有一个地图列表,我想从中检索给定某个“columnId”的“字段”的值。

(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")

这将返回一系列答案,因为可能不止一行具有相同的键。如果真的只有一个,那么添加对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 回答