如何从Clojure中的映射列表中获取值

如何从Clojure中的映射列表中获取值,clojure,Clojure,我有一个映射列表,在给定某个“columnId”的情况下,我想从中检索“field”的值 这是可行的,但我的直觉告诉我必须有一个更干净的方法来做 有更好的方法吗 如果您在不更改字段到列的映射的情况下进行大量查找,那么构建“columnId”->“field”映射可能是值得的,例如 (def column-to-field (zipmap (map #(% "columnId") field-to-column-mapping) (map #(% "field") fie

我有一个映射列表,在给定某个“columnId”的情况下,我想从中检索“field”的值

这是可行的,但我的直觉告诉我必须有一个更干净的方法来做


有更好的方法吗

如果您在不更改
字段到列的映射的情况下进行大量查找,那么构建
“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"}
另一种将
列定义为字段的方法是(我不确定哪种方法更好/更有效):


现在
(列到字段“1”)
给出了所需的结果。

使用
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

的调用。可能重复的In-clojure映射是其键的函数。因此,当需要查找函数时,构建一个映射并直接使用它。很不错的!
(def column-to-field
   (apply hash-map
      (mapcat
         #(vector (% "columnId") (% "field"))
         field-to-column-mapping)))
(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")