2016-12-03 71 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到(网格大小*网格大小)的索引? 如果不是,我可能会做你所说的话并在我的数据上添加一些元数据 –