实现此目的的一种方法是使用flatMap,它会从数组中删除 nil,因此我们只需为要删除的索引返回 nil:
let n = 3
let arr = [2.0, 4.0, 3.0, 1.0, 4.5, 3.3, 1.2, 3.6, 10.3, 4.4, 2.0, 13.0]
let filteredArr = arr.enumerate().flatMap {$0.index % n == n - 1 ? nil : $0.element }
对于 Swift 3:
let filteredArr = thisArray.enumerated().flatMap {$0.offset % n == n - 1 ? nil : $0.element }
一般来说,您会忽略数组的N-1th 元素。
可以通过 strides 实现更实用的解决方案:
let filteredArr = (n-1).stride(to: arr.count, by: n).flatMap { arr[($0-n+1)..<$0] }
这里的做法是获取将被过滤掉的索引,然后将两个连续过滤掉的索引之间的切片连接起来。
或者另一种方法,通过reduce,这实际上是 filter/map/flatMap 简化为:
let filteredArr = arr.enumerate().reduce([]) { $1.0 % n == n - 1 ? $0 : $0 + [$1.1] }
// or, both produce the same results
let filteredArr = arr.reduce((0,[])) { ($0.0 + 1, $0.0 % n == n - 1 ? $0.1 : $0.1 + [$1]) }.1
不是最后,一种数学方法:获取数组中的一组索引,减去我们不想要的索引,从排序的结果索引构建结果数组:
let filteredArr = Set(0..<arr.count).subtract((n-1).stride(to: arr.count, by: n)).sort(<).map { arr[$0] }