How can I idiomatically update * the item in my-vec with :id=1 to have values :a=’baz2′ and :b=’spam2′? *: I recognize that I wouldn’t actually be updating my-vec, but really returning a new vector that is identical to my-vec except for the replacement values. map a function over the vector of maps that either creates a modified map if the key matches or uses the original if the keys don’t match then turn the result back into a vector It is possible to do this more succinctly though this one really shows where the structural sharing occurs. If you need to access your data by id a lot, another idea is to replace your vector of hash-maps with a hash-map of hash-maps keyed on :id. Then you can more easily assoc-in no matter the order of things. Might want to take a look at array-map which creates a map backed by an array and keyed by the index instead of using :id? Source.