Есть несколько разных подходов к этому.Допустим, у вас есть
(def data {1 ["hello" "world"]})
Простой способ
(def modified (assoc data 1 ["good" "night"]))
;; {1 ["good" "night"]}
Это просто возвращает новую структуру данных со значением, замененным на 1, для нового вектора соответствующих элементов.Но это работает только для довольно простых вещей, когда вы точно знаете, что находится в векторе.
Менее простой способ
(def result
(into (sorted-map)
(map
(fn [[k v]]
(if (some #{"hello" "world"} v)
[k (assoc (assoc v (.indexOf v "hello") "good")
(.indexOf v "world")
"night")]
[k v]))
(seq data))))
(print result) ; {1 ["good" "night"]}
Здесь seq
, вызываемый на карте, возвращает ленивую последовательностькортежи ключ / значение.Мы отображаем те с помощью функции, которая проверяет значения, которые мы хотим заменить, и возвращает либо новый кортеж ключ / значение со словами, замененными на соответствующие знаки в векторе, либо оригинал, если «привет» / «мир» не находятся ввектор.Затем into
превращает его обратно в карту.