这是一种方法:
(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。