0

Après l'exécution d'une requête contre le db, le retour de la auj la liste des cartes:Comment itérer niché PersistentArrayMap dans Clojure/script

({:id 1 :name "Book 1" :category "Drama"} 
{:id 2 :name "Book 2" :category "Drama"} 
{:id 3 :name "Book 3" :category "Poetry"} 
{:id 4 :name "Book 4" :category "Poetry"} 
{:id 5 :name "Book 5" :category "Fantasy"} 
{:id 6 :name "Book 6" :category "Fantasy"} 
{:id 7 :name "Book 7" :category "Fantasy"} 
{:id 8 :name "Book 8" :category "Science fiction"} 
{:id 9 :name "Book 9" :category "Science fiction"} 
{:id 10 :name "Book 10" :category "Science fiction"} 
...) 

, je regrouper les données par catégorie et group-by fonction retourne une persistant carte de tableau contient des clés de DOD et de cartes comme vecteur vals:

{"Fantasy" [{:category "Fantasy", :name "Book 5", :id 5} 
      {:category "Fantasy", :name "Book 6", :id 6} 
      {:category "Fantasy", :name "Book 7", :id 7}], 
"Drama" [{:category "Drama", :name "Book 1", :id 1} 
      {:category "Drama", :name "Book 2", :id 2}], 
"Poetry" [{:category "Poetry", :name "Book 3", :id 3} 
      {:category "Poetry", :name "Book 4", :id 4}], 
"Science fiction" [{:category "Science fiction", 
        :name "Book 8", 
        :id 8} 
        {:category "Science fiction", 
        :name "Book 9", 
        :id 9} 
        {:category "Science fiction", 
        :name "Book 10", 
        :id 10}]} 

Ensuite, je fais ceci:

(doseq [[k [{:keys [id name]} v]] data] 
    (println k) 
    (println id name)) 

L'effet secondaire est la suivante:

Drama 
1 Book1 
Poetry 
3 Book3 
Fantasy 
5 Book5 
Science fiction 
8 Book8 

doseq retourné qu'une seule valeur pour chaque clé.

Comment puis-je obtenir le reste des valeurs? Le résultat doit être:

Drama 
1 Book1 
2 Book2 
Poetry 
3 Book3 
4 Book4 
Fantasy 
5 Book5 
6 Book6 
7 Book7 
Science fiction 
8 Book8 
9 Book9 
10 Book10 

Répondre

0

vous pouvez juste faire une boucle interne comme ceci:

(doseq [[k vs] data] 
    (println k) 
    (doseq [{:keys [id name]} vs] 
    (println id name))) 

ou en utilisant simple doseq:

(doseq [[k vs] data 
     {:keys [id name] :as v} vs] 
    (when (= v (first vs)) 
    (println k)) 
    (println id name)) 

aussi il y a une façon plus sale pour imprimer une chaîne de boucle externe une fois:

(doseq [[k vs] data 
     :when (or (println k) true) 
     {:keys [id name] :as v} vs] 
    (println id name)) 

ou même comme ceci:

(doseq [[k vs] data 
     {:keys [id name] :as v} (do (println k) vs)] 
    (println id name)) 
+0

Merci beaucoup pour votre temps et de clarification, fonctionne comme par magie :)! – graaf