keep-indexed和map-indexed之间的区别?

时间:2014-11-13 15:52:14

标签: clojure

map-indexedkeep-indexed之间的区别是什么?

2 个答案:

答案 0 :(得分:3)

map-indexed与map类似,不同之处在于coll中每个元素的索引作为第一个arg传递给map-indexed所采用的函数,并且该元素作为第二个arg传递给函数。

所以

(map-indexed + [1 2 3 4]) ;=> ((+ 0 1) (+ 1 2) (+ 2 3) (+ 3 4)) => (1 3 5 7)

keep-indexed的工作方式与map-indexed的工作方式相同,只是if(f index value)返回nil,它不包含在生成的seq中。

例如:

(keep-indexed #(and %1 %2) [1 2 3 nil 4]) ;;=> (1 2 3 4)

您可以将保持索引作为map-indexed包装在过滤器中,如下所示:

(filter (complement nil?) (map-indexed f coll))

答案 1 :(得分:1)

如果结果不是

Keep-indexed会保留fn的结果

(keep-indexed #(if (odd? %1) %2) [:a :b :c :d :e])
;;(:b :d)
无论返回值是否为零,

map-indexed都会保留将fn应用于coll的所有结果

(map-indexed #(if (odd? %1) %2) [:a :b :c :d :e])
;; (nil :b nil :d nil)