Проблема с пониманием compactMap и flatMap

Я прошел через несколько руководств, которые flatMap/compactMap используются для flatten массива массивов, но в моем случае это не работает, или я не понимаю его должным образом.

let myArray = [["Raja","Kumar", nil,"Waqas"],["UAE","SINGAPORE","dUBAI","HONGKONG"]]
let final = myArray.compactMap{ $0 }

print("Result:\(final)")

Вывод:

Result:[[Optional("Raja"), Optional("Kumar"), nil, Optional("Waqas")], [Optional("UAE"), Optional("SINGAPORE"), Optional("dUBAI"), Optional("HONGKONG")]]

Я попытался удалить nil из приведенного выше массива, но он все равно не сглаживает мой массив.

Любая помощь приветствуется.


person Muhammad Waqas Bhati    schedule 03.04.2019    source источник
comment
Вот вкратце: compactMap фильтрует все nil значения из массива, flatMap превращает массив массивов в один массив, вытягивая все значения из вложенных массивов в один.   -  person LinusGeffarth    schedule 03.04.2019


Ответы (3)


compactMap следует использовать для фильтрации nil элементов из массива Optional, а flatMap можно использовать для выравнивания многомерного массива. Тем не менее, вам нужно сделать и то, и другое.

let final = myArray.flatMap{$0.compactMap{$0}}

print("Result:\(final)")
person Dávid Pásztor    schedule 03.04.2019

.compactMap

... используется для создания списка без необязательных объектов, вам нужно использовать compactMap во внутреннем массиве, где вы получили nils, например:

let result = myArray.map { $0.compactMap { $0 } }

Результат: [["Raja", "Kumar", "Waqas"], ["UAE", "SINGAPORE", "dUBAI", "HONGKONG"]]


.flatmap

... используется для выравнивания коллекции коллекций, например

let result = myArray.flatMap { $0.compactMap { $0 } }

Результат: ["Raja", "Kumar", "Waqas", "UAE", "SINGAPORE", "dUBAI", "HONGKONG"]

person AamirR    schedule 03.04.2019

Пожалуйста, прочитайте документацию

карта(_:)

Возвращает массив, содержащий результаты сопоставления данного замыкания с элементами последовательности.

compactMap(_:)

Возвращает массив, содержащий non-nil результаты вызова данного преобразования с каждым элементом этой последовательности.

flatMap(_:)

Возвращает массив, содержащий объединенные результаты вызова данного преобразования с каждым элементом этой последовательности.

Каждый раздел Обсуждение содержит пример.

person vadian    schedule 03.04.2019