当我在Reagent中迭代vector时,就像这样:
(for [item ["rattata" "pidgey" "spearow"]]
[:li item])])
我想得到一个特定项目的索引 - 像这样:
[:li item index]
我没有询问一般的clojure' for,因为迭代矢量的另一种方式也会让我感到满意。
答案 0 :(得分:3)
这实际上是一个普通的Clojure问题,而不是Reagent特有的问题,但是有一些方法可以做到这一点。
您可以使用类似
的方式与当前代码类似地处理它(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
和朋友会返回可能会干扰试剂的懒惰列表(如果忘记它,它会向控制台发出警告)。
答案 1 :(得分:0)
您还可以将map-indexed与for-loop结合使用:
(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])])
答案 2 :(得分:0)
您可以使用for-indexed
宏:
(defmacro for-indexed [[item index coll] & body]
`(for [i# (range (count ~coll))]
(let [~item (nth ~coll i#)
~index i#]
~@body)))
(for-indexed [item index ["rattata" "pidgey" "spearow"]]
[:li item index])
;; => ([:li "rattata" 0] [:li "pidgey" 1] [:li "spearow" 2])
或者,不要在绑定中传递index
,而让for-indexed
返回[index item]
向量,如下所示:
(defmacro for-indexed [[item coll] & body]
`(for [i# (range (count ~coll))]
(let [~item [i# (nth ~coll i#)]]
~@body)))
(for-indexed [item ["rattata" "pidgey" "spearow"]]
[:li item])
;; => ([:li [0 "rattata"]] [:li [1 "pidgey"]] [:li [2 "spearow"]])