Присоединение к вложенным ассоциативным структурам - PullRequest
4 голосов
/ 28 июня 2011

У меня есть структура, которую я создал в REPL,

{1 {10 {:id 101, :name "Paul"}, 
    20 {}}, 
2 {30 {}, 40 {}}, 
3 {50 {}, 60 {}}}

, и я хочу добавить новое kv к ключу 1, чтобы полученная структура выглядела следующим образом:

{1 {10 {:id 101, :name "1x2"}, 20 {}, 11 {:id 102, :name "Ringo"}},
 2 {30 {}, 40 {}}, 3 {50 {}, 60 {}}}.

Я только что обнаружил get-in update-in и assoc-in для работы с такими вложенными структурами, но не могу понять, как добавлять новые элементы в элементы.В моем приложении все это обернуто в ref и обновлено с помощью dosync / alter, но сейчас я просто хочу сделать это в REPL.

Может быть, я только что посмотрел на это тожедолго, но любая попытка использовать ассоциацию или ассоциацию просто изменяет то, что уже есть, и не добавляет новые элементы.

Ответы [ 2 ]

7 голосов
/ 28 июня 2011

С учетом вашего ввода

(def input
  {1 {10 {:id 101 :name "Paul"}
      20 {}}
   2 {30 {} 40 {}}
   3 {50 {} 60 {}}})

Вы можете использовать ассоциацию для добавления элемента на вложенную карту с ключом 1, например так:

(assoc-in input [1 11] {:id 102 :name "Ringo"})

, что дает

{1 {10 {:id 101 :name "Paul"}
    11 {:id 102 :name "Ringo"}
    20 {}}
 2 {30 {} 40 {}}
 3 {50 {} 60 {}}}

Assoc-in не обязательно указывать на самый глубокий уровень структуры.

Если вы используете два вызова для Assoc-in, вы можете использовать второй для изменения имени.От «Пола» до «1х2» согласно вашему примеру:

(assoc-in
  (assoc-in input [1 11] {:id 102 :name "Ringo"})
  [1 10 :name] "1x2"))

Что возвращает

{1 {10 {:id 101 :name "1x2"}
    11 {:id 102 :name "Ringo"}
    20 {}}
 2 {30 {} 40 {}}
 3 {50 {} 60 {}}}
1 голос
/ 29 июня 2011

Что бы это ни стоило, вы все равно могли бы сделать это, если бы вам пришлось указывать на существующий узел:

(update-in input [1] assoc 11 
  {:id 102 :name "Ringo"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...