2016-12-03 37 views
0

獨特的價值觀讓我們假設我們有值這個網格,可以是0或1:Clojure的列表理解和試劑

(def grid [[1 0 1] 
      [1 0 0] 
      [1 0 1]]) 

現在我想改變grid到HTML中使用列表理解打嗝一樣的格式:

(defn cell-component [is-it-1 key] 
    ^{:key key} [:td (if (= is-it-1 1) {:class "is-it-1"})]) 


(defn grid-html [] 
    ([:table 
    [:tbody 
    (for [row grid] 
     ^{:key row} [:tr 
         (for [cell row] 
         (cell-component cell how-i-can-generate-a-index?))])]])) 

表正確生成,但我沒有任何想法,如何使unique indextdhow-i-can-generate-a-index?應該是什麼?

+0

附註:grid-html中'[:table ...]'的圓括號是多餘的(當它們轉換成函數調用時,代碼將不會與它們一起運行 - 需要返回組件:'(defn grid-html [] [:table [:tbody ...]])') –

+0

只需使用map-indexed而不是for。 – ClojureMostly

回答

2

在你的情況下,每個單元格都由它在行內的索引唯一標識。此外,這將是更自然的母體結構,而不是在組件註明兒童的鑰匙:

(defn cell-component [is-it-1] 
    [:td (if (= is-it-1 1) {:class "is-it-1"})]) 

(for [[i cell] (map-indexed vector row)] 
    ^{:key i} [cell-component cell]) 

請注意,您應該根據索引鍵同樣分配到行 - 如果你有^{:key row}將無法​​正常工作複製表格中的行。

0

你只需要調用gensym

(cell-component cell (gensym)) 

這是一個通用的方法來做到這一點。但通常最好在數據中找到一些已經提供獨特區分的屬性。

如果你喜歡看到數字從0計數,那麼你可以編寫自己的序列發生器:

(def uniq-key (atom -1)) 
(defn gen-key [] 
    (swap! uniq-key inc)) 

隨着你第一次撥打以上(gen-key)你回來0,第二次1等。

+0

我可以做到這一點,但用'gensym'生成一個新的符號,試劑的所有點和關鍵屬性是在您的數據中有一個唯一的ID。你有什麼想法如何創建從0到(網格大小*網格大小)的索引? 如果不是,我可能會做你所說的話並在我的數據上添加一些元數據 –