Clojure: установить значение в качестве ключа - PullRequest
0 голосов
/ 14 февраля 2019

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

Я имею в виду что-то вроде:

(defn init-item [v item]
  (let [{:keys [id value]} item]
    (-> v
        (assoc :{ID_AS_A_KEY} value))))

И я получаю:

(init-item {} {:id "123456789" :value [:name "King" :surname "Leonid"]})
user=> {:123456789 [:name "King" :surname "Leonid"]}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Только не делай этого.Используйте саму строку в качестве ключа карты.Нет причин делать это ключевым словом.Намного легче работать, если оставить это в покое.

(defn init-item [v item]
  (assoc v (:id item) (:value item)))
0 голосов
/ 14 февраля 2019

Я думаю, это то, что вы хотели сделать:

  (defn init-item
    [dest-map item]
    (let [item-id-str (:id item)
          item-val    (:value item)
          item-id-kw  (keyword item-id-str)]
      (assoc dest-map item-id-kw item-val)))

  (let [all-items {:a 1 :b 2 :c 3}
        item-1    {:id    "123456789"
                   :value [:name "King" :surname "Leonid"]}]

(init-item all-items item-1)  
  ;=>  {:a 1, :b 2, :c 3, :123456789 [:name "King" :surname "Leonid"]}

Clojure имеет функции name, symbol и keyword для преобразования между строками и символами / ключевыми словами.Поскольку у вас уже есть идентификатор в виде строки, вам просто нужно вызвать keyword для его преобразования.

Обязательно всегда оставляйте вкладку браузера открытой для Clojure CheatSheet .

...