2016-08-07 61 views
3

當我遍歷載體,試劑,像這樣:如何獲得索引項試劑

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

我想獲得一個特定項目的指標 - 這樣的:

[:li item index] 

我不是在問一般clojure'for',因爲另一種迭代vector的方式也會讓我滿意。

+1

'地圖indexed'或'map'超過兩集,其中一人是一個範圍 –

+0

感謝。 那麼是否有任何理由在這種情況下使用'for'? 地圖看起來更簡潔: '(圖兒童組件的功能集)' 對比: '(對[項收藏] (兒童組件的功能項))' –

回答

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

我問試劑,因爲在他們的頁面上的例子中的所有迭代都使用'for'。 其實我會發現他們更可讀'地圖'或'地圖索引',它的工作原理,所以我想知道他們爲什麼''爲'。對Clojure來說還是很新的,我恐怕在這裏錯過了一些東西。 –

+0

經過一番調查: map-indexed是好的,但沒有實例化反應組件,並且不允許在函數內部取消引用原子。 與doall一起使用時,它可讓您解除引用原子,但仍不會創建組件。 因爲是要走的路,所以認爲它應該是[index(range(count items))] –

+0

另一個不錯的選擇是map(map-indexed(fn [index item]){{:key index} [component 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])])