как обновить только несколько ключей на карте в clojure? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть карта, в которой я хочу обновить значения (которые являются строками) но я хочу обновить только несколько ключей, а не все ключи.

Я новичок и понятия не имею, как это сделать.

Можно ли обновить только несколько ключей на карте Clojure, оставив остальные?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

update является допустимым способом сделать это, если вы хотите применить функцию к вашим значениям. в противном случае вы можете просто связать новые значения с картой

(def example {:a "a" :b "b" :c "c"})
(assoc example
       :a "foo"
       :c "bar")
#=> {:a "foo" :b "b" :c "bar")

или update-in для вложенных данных

(def example {:data {:a "a" :b "b" :c "c"}})
(update-in example [:data] assoc 
           :a "foo" 
           :c "bar")
#=> {:data {:a "foo" :b "b" :c "bar"}}
0 голосов
/ 10 сентября 2018

Попытка суммировать комментарии и ответы до сих пор ...

Есть несколько способов обновить только некоторые ключи на вашей карте. Какой из них лучший, зависит от

  • Является ли ваша структура данных вложенной?
    • Если вложено, используйте 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)
0 голосов
/ 10 сентября 2018

Следующее обновит только ключи :a и :b:

(def example {:a 1 :b 2 :c 3})
(-> example
    (update :a inc)
    (update :b inc))
;; {:a 2, :b 3, :c 3}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...