我有一个地图列表,我希望在给定某个“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")
这很有效,但我的直觉告诉我必须有一个更清洁的方法来做到这一点。
有更好的方法吗?
答案 0 :(得分:5)
使用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
的调用。
答案 1 :(得分: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")
会提供所需的结果。