这是一种方法:
(some #(if (= "GEICO" (:name %)) %) testVMap)
这就是说:返回等于testVMap
的第一件事。 定义一个函数,用作为它的函数参数。这部分返回每个映射的值的值。:name
"GEICO"
#(... % ...)
%
(:name %)
:name
如果可能有多个“GEICO”地图,并且您想要它们,请使用filter
而不是some
.
这是另一个版本:
(some #(and (= "GEICO" (:name %)) %) testVMap)
您可能也想使用update
。
编辑:例如:
(map #(if (= "GEICO" (:name %))
(update % :rate inc)
%)
testVMap)
这inc
是将数字加 1 的函数。您应该将其替换为执行所需转换的函数,例如#(+ 10 %)
、 或(partial + 10)
,这是同一件事。
定义的函数#(...)
检查 的值是否:name
为“GEICO”,如果是,则使用您提供的函数更新汇率(inc
在本例中);否则,#(...)
原样返回地图。
update
如果从上下文中无法自我解释,我将留给您查找 的文档。
您也可以使用mapv
代替map
.
毫无疑问,您希望将所有这些构建到一个或多个函数中。请记住,函数是 Clojure 中的东西——它们是“数据”、第一类对象等。所以在我使用的地方inc
,你可以有一个函数参数,你定义的函数可以接受另一个函数作为它的参数,第一个然后函数将在update
代码的一部分中使用(而不是inc
)。
关于在您想要的地图不存在时添加地图:如果您不处理一长串地图,我会考虑在不同的步骤中执行此操作。有关用于测试集合是否包含元素的函数名称,请参阅 Andre 的答案。
但是,请注意,测试向量是否包含不存在的内容需要 Clojure 浏览整个向量。使用 Clojure 集合而不是向量可能会更好,或者考虑使用带有 (例如) , 等作为键的外部:aaa
映射:geico
。在这种情况下,请查看函数update-in
。