Одним из способов достижения этой цели является использование flatMap
, который среди прочего, он удаляет Nils из массива, таким образом, мы будем просто вернуть 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 }
для быстрой 3:
let filteredArr = thisArray.enumerated().flatMap {$0.offset % n == n - 1 ? nil : $0.element }
Вообще говоря, вы игнорируете N-1
-й элемент массива.
Более функциональное решение может быть достигнуто с помощью махов:
let filteredArr = (n-1).stride(to: arr.count, by: n).flatMap { arr[($0-n+1)..<$0] }
Подход здесь, чтобы получить индексы, которые будут отфильтрованы, а затем соединить кусочки между двумя последовательными отфильтрованных индексов.
Или другой подход, с помощью reduce
, что на самом деле в какой фильтр/карты/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] }