map-indexed
和keep-indexed
之间的区别是什么?
答案 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)