Попытка суммировать комментарии и ответы до сих пор ...
Есть несколько способов обновить только некоторые ключи на вашей карте. Какой из них лучший, зависит от
- Является ли ваша структура данных вложенной?
- Если вложено, используйте
assoc-in
вместо assoc
или update-in
вместо update
.
- Вы вычисляете новые значения на основе старых?
- Если вам нужны старые значения, используйте
update
и update-in
сверх assoc
и assoc-in
.
- Сколько у вас ключей и как они у вас?
- Функции
assoc
, assoc-in
, update
и update-in
- все используют рекурсию под колпаком для более чем одной клавиши. Со многими ключами вы можете столкнуться с исключениями переполнения стека. То же самое верно для обозначения, использующего ->
, который переписывает ваш код во вложенные вызовы.
- В таких случаях используйте
into
или merge
, если вы используете assoc
в противном случае.
- Использование
into
или merge
также будет проще, если у вас нет фиксированного набора ключей для обновления, но что-то, что вычисляется во время выполнения.
- Обратите внимание, что
into
может быть быстрее, чем merge
, так как он использует полиморфный reduce
под капотом.
- Если вы вычисляете новые значения на основе старых, то есть иначе использовали бы
update
, рассмотрите возможность итерации по вашей карте, используя reduce
один раз, и соберите новые значения. Это более низкоуровневый режим, но он может избежать повторения дважды в зависимости от вашего сценария.
Примеры
Пожалуйста, смотрите (и upvote :-) другие ответы для примеров с assoc
, assoc-in
, update
и update-in
.
(def sample-map {:a 1 :b 2 :c 3})
(def new-values {:b 22 :c 33})
(into sample-map new-values)
(merge sample-map new-values)