Есть ли в Swift аналог в flatten
Scala, Xtend, Groovy, Ruby и со?
var aofa = [[1,2,3],[4],[5,6,7,8,9]]
aofa.flatten() // shall deliver [1,2,3,4,5,6,7,8,9]
конечно, я мог бы использовать уменьшить для этого, но это отстой
var flattened = aofa.reduce(Int[]()){
a,i in var b : Int[] = a
b.extend(i)
return b
}
Ответы:
Swift> = 3.0
reduce
:flatMap
:joined
:источник
flatMap
доступно с Swift 1.2.joined
(формально известная какflatten
) сflatMap
? Является ли это, что, хотяflatMap
присоединяется, он также может отображать / преобразовывать вещи. но здесь в примере мы действительно не нуждаемся, т.е. мы возвращаемся$0
flatMap
будет либо сглаживается 2D - массив в массиве 1D или удалитьnil
значения, а не оба. Он определяет, что делать, основываясь на том,Element
является ли массив 1-го уровня массивом или необязательным, поэтому, если вы передадите ему 2D-массив опций (например[[Int?]]
), он выберет его выравнивание до 1D (например[Int?]
) . Чтобы сгладить 1-D и удалить нули 2-го уровня, вам придется это сделатьarray.flatMap { $0 }.flatMap { $0 }
. Другими словами, выравнивание размеров эквивалентноArray(array.joined())
и «выравнивание» удаления нулей эквивалентноarray.filter{ $0 != nil }.map{ $0! }
.flatMap
по-прежнему подходит для использования, описанного в вопросе (выравнивание двумерного массива до 1D).compactMap
явно для удаленияnil
элементов из последовательности, как вариантflatMap
когда-то сделал.[[Any]]
, aflatMap
просто преобразует его в тип[Any]
([1, 2, 3, 4, [5, 6], 7, 8, 9]). И если бы мы подали заявкуflatMap
снова, мы бы действовали на "Любой?" тип, где компилятор больше не знает, является ли это простым значением или самим массивом.В стандартной библиотеке Swift есть
joined
функция реализована для всех типов , соответствующихSequence
протоколу (илиflatten
наSequenceType
прежде , чем Swift 3), который включает в себяArray
:В некоторых случаях использование
joined()
может быть полезным, так как оно возвращает ленивую коллекцию вместо нового массива, но всегда может быть преобразовано в массив при передачеArray()
инициализатору, как в примере выше.источник
FlattenBidirectionalCollection<Array<Array<Int>>>(_base: [[1, 2, 3], [4], [5, 6, 7, 8, 9]]))
. Ваша точка зрения верна, хотя вы можете обращаться к ней как к плоскому массиву, поэтому может показаться, чтоCustomStringConvertable
реализация вводит в заблуждение. Ваш фрагмент кода был и до сих пор не прошел тест.flatten()
был переименован вjoined()
Swift 4.x / 5.x
Просто чтобы добавить немного больше сложности в массив, если есть массив, который содержит массив массивов, то на
flatMap
самом деле потерпит неудачу.Предположим, что массив
Что
flatMap
илиcompactMap
возвращает это:Чтобы решить эту проблему, мы можем использовать нашу простую для логики цикла + рекурсия
Так что вызывайте эту функцию с заданным массивом
Результатом является:
Эта функция поможет сгладить любой вид массива, учитывая случай
Int
здесьВыход детской площадки:
источник
Swift 4.x
Это использование
flatMap
не считается устаревшим, и это сделано для этого. https://developer.apple.com/documentation/swift/sequence/2905332-flatmapисточник
Изменить: использовать
joined()
вместо:https://developer.apple.com/documentation/swift/sequence/2431985-joined
Оригинальный ответ:
источник
Swift 4.2
Я написал простое расширение массива ниже. Вы можете использовать, чтобы сгладить массив, который содержит другой массив или элемент. в отличие от метода join ().
использование:
источник
Еще одна более общая реализация
reduce
,Это выполняет то же самое, но может дать больше понимания того, что происходит
reduce
.Из документов Apple,
Описание
Вернуть результат многократного вызова объединения с накопленным значением, инициализированным в исходное и каждый элемент последовательности , по очереди.
источник
Use of unresolved identifier 'reduce'
Модифицированный ответ @ RahmiBozdag, 1. Методы в публичных расширениях являются публичными. 2. Удален лишний метод, так как стартовый индекс всегда будет нулевым. 3. Я не нашел способа поместить compactMap внутрь для nil и опций, потому что внутри метода T всегда [Any?], Любые предложения приветствуются.
источник
Вы можете сгладить вложенный массив, используя следующий метод:
источник
Apple Swift версии 5.1.2 (swiftlang-1100.0.278 clang-1100.0.33.9)
Цель: x86_64-apple-darwin19.2.0
источник
Swift 5.1
Если вы также хотите это для значений словаря:
источник
flatten()
был переименованjoined()
в Swift 3 согласно SE-0133:https://github.com/apple/swift-evolution/blob/master/proposals/0133-rename-flatten-to-joined.md
источник
матрица [[myDTO]]?
В Swift 5 вы можете использовать this = Array (self.matrix! .Joined ())
источник
источник