用于更新与向量中的谓词匹配的映射的惯用方法

Sea*_*len 6 clojure

我引用了一个添加了地图的vector [].如果我想根据谓词匹配更改地图项的值,那么这样做的惯用方法是什么?

例如...

[{:id 1:name"Joe"} {:id 2:name"Fred"}]

我们希望将名称为'Brian'的任何id更新为2.

trp*_*lin 6

这是一种方式:

(def people [ { :id 1 :name "Joe" } { :id 2 :name "Fred" } ])

(defn brian-converter [person] 
  (if (= 2 (:id person)) 
      (assoc person :name "Brian") 
      person))

(map brian-converter people)
;;=> ({:id 1, :name "Joe"} {:id 2, :name "Brian"})
Run Code Online (Sandbox Code Playgroud)

根据您对这些值的预期变化,您可能更喜欢更灵活的东西:

(defn create-converter [[key-to-match val-to-match] 
                        key-to-replace val-to-replace]
  (fn [person]
    (if (= val-to-match (key-to-match person))
        (assoc person key-to-replace val-to-replace)
        person)))

(map (create-converter [:id 2] :name "Brian") people)
;;=> ({:id 1, :name "Joe"} {:id 2, :name "Brian"})
(map (create-converter [:id 1] :name "Dude") people)
;;=> ({:id 1, :name "Dude"} {:id 2, :name "Fred"})
Run Code Online (Sandbox Code Playgroud)

参数表示的选择(搜索参数的向量,替换的展开参数)create-converter对我来说是任意的; 不确定是否有规则.