Получение n-го элемента вложенной карты - PullRequest
0 голосов
/ 05 января 2019

Я хотел бы получить n-й элемент вложенной карты, но не смог найти подходящую команду и получил ошибку. Мне нужно что-то, что работает как first функция:

boot.user=>   (def db2 @main/database)
#'boot.user/db2
boot.user=> (def ims (get-in db2 [kl :items]))
#'boot.user/ims
boot.user=> ims
{"i15059" {:name "ESS1", :done? false}, "i15064" {:name "ESS2", :done? false}, "i15114" {:name "ESS3", :done? false}, "i15121" {:name "ESS3", :done? false}}
boot.user=> (first ims)
["i15059" {:name "ESS1", :done? false}]
boot.user=> (nth ims 1)

java.lang.UnsupportedOperationException: nth not supported on this type: PersistentArrayMap
boot.user=> 

Есть предложения?

1 Ответ

0 голосов
/ 05 января 2019

Карта неупорядочена (если вы явно не создали sorted-map). Когда вы получаете записи на карте (такие как for loop или first), Clojure беззвучно вызывает seq на карте, чтобы получить «список-подобную» последовательность MapEntry элементов:

(def mappy {:c 3 :d 4 :a 1 :b 2 })

mappy          => {:c 3, :d 4, :a 1, :b 2}
(seq mappy)    => ([:c 3] [:d 4] [:a 1] [:b 2])
(vec mappy)    => [[:c 3] [:d 4] [:a 1] [:b 2]]
(first mappy)  => [:c 3]

Обратите внимание, что seq печатается как список, но это не так. MapEntry печатает как вектор, но не печатает.

(seq mappy)    => <#clojure.lang.PersistentArrayMap$Seq ([:c 3] [:d 4] [:a 1] [:b 2])>

(first mappy)  => <#clojure.lang.MapEntry [:c 3]>

Если у вас есть какой-то последовательный объект (вектор, список или последовательность), вы можете использовать nth, чтобы получать элементы по одному:

(let [mapseq (seq mappy)
      mapvec (vec mappy) ]

  (nth mapseq 3) => [:b 2]
  (nth mapvec 3) => [:b 2]

Однако обратите внимание, что возвращаемый элемент все еще является MapEntry, а не 2-вектором.

  (nth mapseq 3) => <#clojure.lang.MapEntry [:b 2]>
  (nth mapvec 3) => <#clojure.lang.MapEntry [:b 2]>

Вы можете получить ключ и значение из MapEntry, используя функции key и val:

(key (nth mapseq 3)) => :b
(val (nth mapvec 3)) => 2

P.S. Вы можете напечатать значение и его тип, как указано выше , используя функцию spyxx .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...