Menu
CoddyTech

flatMap

Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 29 trên 56.

flatMap dùng trong trường hợp mỗi phần tử tạo ra nhiều kết quả. Closure trả về một mảng; flatMap nối tất cả các mảng đó thành một mảng phẳng.

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

Bạn cũng có thể thực hiện công việc thực sự bên trong closure. Ánh xạ từng giá trị thành một mảng nhỏ rồi làm phẳng kết quả chỉ trong một bước là trường hợp sử dụng phổ biến:

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

So sánh với map: cách đó sẽ tạo ra một [[Int]], tức là một mảng gồm các mảng nhỏ, rồi bạn cần thêm một bước nữa để làm phẳng mảng. flatMap gộp hai bước đó thành một.

challenge icon

Thử thách

Dễ

Đọc hai dòng đầu vào:

  1. Một danh sách số nguyên được phân tách bằng dấu phẩy, nums
  2. Một danh sách số nguyên được phân tách bằng dấu phẩy, repeats (có cùng độ dài với nums)

Với mỗi i, lặp lại nums[i] đúng repeats[i] lần. In ra mảng phẳng thu được, với các phần tử được nối bằng ,. Dùng flatMap.

Với đầu vào là 5,7,2 ở dòng 1 và 3,1,2 ở dòng 2, đầu ra là 5,5,5,7,2,2.

Tự làm thử

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

// TODO: dùng flatMap để chuyển từng cặp (num, repeat) thành Array(repeating:count:), rồi nối các phần tử bằng ","
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng thực thi

Tự luyện tập: Playground Swift