Dưới đây là một cách:
(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"})
Tùy thuộc vào cách mà bạn mong đợi những giá trị thay đổi, bạn có thể thích một cái gì đó linh hoạt hơn:
(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"})
Sự lựa chọn đại diện tham số (vector cho params tìm kiếm , đối số chưa được kiểm định cho các thay thế) trong create-converter
là loại tùy ý đối với tôi; không chắc chắn nếu có một quy tắc cho điều đó.
xem: http://stackoverflow.com/questions/2330281/how-can-i-update-a -vector-item-in-clojure –