如何获得试剂中物品的索引

时间:2016-08-07 16:18:54

标签: clojure clojurescript reagent hiccup

当我在Reagent中迭代vector时,就像这样:

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

我想得到一个特定项目的索引 - 像这样:

  [:li item index]

我没有询问一般的clojure' for,因为迭代矢量的另一种方式也会让我感到满意。

3 个答案:

答案 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"]])