如何获取试剂中某项的索引
How to get index for an item in reagent
当我在 Reagent 中迭代向量时,像这样:
(for [item ["rattata" "pidgey" "spearow"]]
[:li item])])
我想获取特定项目的索引 - 像这样:
[:li item index]
我问的不是一般的 clojure 'for',因为另一种遍历 vector 的方法也会让我满意。
这实际上是一个一般的 Clojure 问题,而不是特定于 Reagent 的问题,但是有几种方法可以做到这一点。
您可以使用类似
的方法来处理它,类似于您当前的代码
(def items ["rattata" "pidgey" "spearow"])
(for [index (range (count items))]
[:li (get items index) index])
您也可以使用 map-indexed
(doall (map-indexed (fn [index item] [:li index item]) items))
本例中的 doall 用于 Reagent,因为 map
和朋友 return 可能会干扰 Reagent 的惰性列表(如果您忘记了,它将向控制台打印警告它)。
您还可以将 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])])
您可以给自己一个 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
return [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"]])
当我在 Reagent 中迭代向量时,像这样:
(for [item ["rattata" "pidgey" "spearow"]]
[:li item])])
我想获取特定项目的索引 - 像这样:
[:li item index]
我问的不是一般的 clojure 'for',因为另一种遍历 vector 的方法也会让我满意。
这实际上是一个一般的 Clojure 问题,而不是特定于 Reagent 的问题,但是有几种方法可以做到这一点。
您可以使用类似
的方法来处理它,类似于您当前的代码(def items ["rattata" "pidgey" "spearow"])
(for [index (range (count items))]
[:li (get items index) index])
您也可以使用 map-indexed
(doall (map-indexed (fn [index item] [:li index item]) items))
本例中的 doall 用于 Reagent,因为 map
和朋友 return 可能会干扰 Reagent 的惰性列表(如果您忘记了,它将向控制台打印警告它)。
您还可以将 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])])
您可以给自己一个 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
return [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"]])