0

Clojure의에서 PersistentArrayMap 중첩 반복하는 방법 fuction를의 반환이지도의 목록입니다 : 그래서가 DB에 대해 쿼리를 실행 한 후/스크립트

({: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"} 
...) 

, I 그룹 부문별로 데이터와 group-by 함수는를 반환 지속적인 배열지도 strs 키와 발스 같은지도의 벡터가 포함

{"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}]} 

다음,이 작업을 수행합니다

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

부작용은 다음

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

doseq 각 키에 대해 하나 개의 값을 반환.

어떻게 나머지 값을 얻을 수 있습니까? 결과는 다음과 같아야합니다 :

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

또는 단일 doseq 사용 :

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

하나 개 더 더러운 방법이

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 

답변

0

방금이 같은 내부 루프를 만들 수 있습니다 외부 루프 문자열을 한 번 인쇄하려면 :

(doseq [[k vs] data 
     :when (or (println k) true) 
     {:keys [id name] :as v} vs] 
    (println id name)) 
심지어이 같은

:

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

당신의 시간 및 설명에 대한 많은 감사합니다, 마법 :)처럼 작동합니다! – graaf