Menu
Coddy logo textTech

flatMap

Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 29 de 56.

flatMap es para el caso en el que cada elemento produce varios resultados. El closure devuelve un array; flatMap concatena todos ellos en un único array plano.

let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all)                       // [1, 2, 3, 4, 5, 6]

También puedes realizar trabajo real dentro del cierre. Mapear cada valor a un array pequeño y aplanar el resultado en un solo paso es el caso de uso típico:

let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs)                     // [1, 1, 2, 4, 3, 9]

Compara con map: eso habría producido un [[Int]], un array de arrays pequeños, lo cual requeriría otro paso para aplanar. flatMap combina esos dos pasos en uno solo.

challenge icon

Desafío

Fácil

Lee dos líneas de entrada:

  1. Una lista de enteros separados por comas, los nums
  2. Una lista de enteros separados por comas, los repeats (de la misma longitud que nums)

Para cada i, repite nums[i] exactamente repeats[i] veces. Imprime el array plano resultante, unido con ,. Usa flatMap.

Para la entrada 5,7,2 en la línea 1 y 3,1,2 en la línea 2, la salida es 5,5,5,7,2,2.

Hoja de referencia

flatMap mapea cada elemento a un array y concatena todos los resultados en un único array plano:

let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]

A diferencia de map (que produciría [[Int]]), flatMap aplana en un solo paso. También puede aplanar arrays anidados directamente:

let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]

Pruébalo tú mismo

let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let repeats = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: aplicar flatMap a cada (num, repeat) en Array(repeating:count:); unir con ","
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo