Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Add single element for multiple keys to map
+4
−0
I have a map and a new item to add to the map and a list of keys I want to attach the new item to:
=> m1
{:a 1 :b 2}
=> itm
3
=> ks
[:c :d :e]
=> m2
{:a 1 :b 2 :c 3 :d 3 :e 3}
I thought of using reduce
, but that seems overly wordy. How best do I do this?
2 answers
+0
−0
(apply assoc m1 (interleave ks (repeat itm)))
Demonstration:
$ clj
Clojure 1.10.3
user=> (def m1 {:a 1 :b 2})
#'user/m1
user=> (def itm 3)
#'user/itm
user=> (def ks [:c :d :e])
#'user/ks
user=> (apply assoc m1 (interleave ks (repeat itm)))
{:a 1, :b 2, :c 3, :d 3, :e 3}
A variation on the other answer, this one uses interleave
and apply
:
-
interleave
returns a lazy sequence of the first element from each argument and then the second element from each argument and then the third, etc, until one runs out. -
apply
calls the given function by treating the last argument (which must be a sequence) as if the elements it contains were directly in the function call. (Works similarly to spread syntax in Javascript and iterable unpacking in Python 3.)
0 comment threads
+0
−0
(merge m1 (zipmap ks (repeat itm)))
Demonstration:
$ clj
Clojure 1.10.3
user=> (def m1 {:a 1 :b 2})
#'user/m1
user=> (def itm 3)
#'user/itm
user=> (def ks [:c :d :e])
#'user/ks
user=> (merge m1 (zipmap ks (repeat itm)))
{:a 1, :b 2, :c 3, :d 3, :e 3}
-
repeat
returns a lazy sequence of the given item. -
zipmap
returns a map with the first input (keys) mapped to the second input (vals), and it stops building the map when either input runs out of elements. In this case, it will be the given vector of keys. -
merge
merges all of the input maps into a single map, left-to-right (so any repeated keys will overwrite previous keys).
0 comment threads