0

循環嵌套PersistentArrayMap執行對數據庫的查詢後,機能的研究的回報是地圖列表:如何用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"} 
...) 

所以,我按類別組數據和group-by函數返回持久性陣列的映射包含STR的鍵和地圖的矢量作爲瓦爾斯:

{"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每個鍵僅返回一個值。

我怎樣才能得到其餘的值? 結果必須是:

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] 
    (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)) 

也還有一個骯髒的方式打印外環字符串一次:

(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