2016-08-07 2 views
3

Когда я перебирать вектор в реагенте, как это:Как получить индекс для элемента в реагенте

(for [item ["rattata" "pidgey" "spearow"]] 
    [:li item])]) 

Я хотел бы получить индекс конкретного элемента - как это:

[:li item index] 

Я не спрашиваю об общем clojure 'for', потому что другой способ итерации по вектору также удовлетворит меня.

+1

'карте-indexed' или' map' более чем две коллекции, где один из них является диапазон –

+0

Спасибо. Так есть ли причина использовать «для» в этом типе сценария? карта кажется более кратким: '(карта коллекция ребенка компонент-функция)' против: '(для [коллекционная вещь] (ребенок-компонентная функция пункт))' –

ответ

3

Это на самом деле общий вопрос Clojure, а не специфический для Реагента, но есть несколько способов, которыми вы могли бы это сделать.

Вы можете подойти к нему так же, как вашему текущему коду с чем-то вроде

(def items ["rattata" "pidgey" "spearow"]) 
(for [index (range items)] 
    [:li (get items index) index])]) 

Вы можете также использовать map-indexed

(doall (map-indexed (fn [index item] [:li index item]) items)) 

doall в этом случае для реактива, так как map и друзья возвращаются ленивыми списки, которые могут помешать работе с реагентом (он выведет предупреждение на консоль, если вы его забудете).

+0

Я спрашиваю о реагенте, потому что все итерации в примерах на их странице используют «для». На самом деле я бы нашел их более читаемыми с помощью «map» или «map-indexed», и он работает, поэтому мне интересно, почему они «за». Еще очень новичок в Clojure, и я боюсь, что здесь что-то не хватает. –

+0

После некоторого исследования: с индексом карты хорошо, но не создает компонент реакции и не позволяет разыменовывать атомы внутри функции. При использовании с doall он позволяет разыменовывать атом, но не создает компонент. for is the way to go, думал, что это должно быть [index (range (count items))] –

+0

Другим хорошим вариантом является '(map-indexed (fn [index item]^{: key index} [item index item]))) –

0

Вы также можете комбинировать карты индексированные с для цикла:

(for [[index item] (map-indexed vector items)] 
    [:li item index])]) 

; vector function is a shorthand: 
(for [[index item] (map-indexed (fn [index item] [index item]) items)] 
    [:li item index])]) 
Смежные вопросы