2016-12-03 1 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 index для моего td. что должно быть how-i-can-generate-a-index??

+0

В качестве побочного примечания: круглые круглые скобки вокруг '[: table ...]' в 'grid-html' являются избыточными (и код не будет работать с ними, поскольку они переходят на вызов функции - пока вы просто нужно вернуть компонент: '(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 появился новый символ, и все точки реагента и атрибут ключа должны иметь уникальный идентификатор в ваших данных. Вы знаете, как создать индекс от 0 до (размер сетки * размер сетки)? Если нет, я всегда могу сделать то, что вы сказали, и добавить некоторые метаданные на мои данные –

Смежные вопросы