Fitter Map & Reduce trong IOS
Xin chào các bạn trong bài viết này mình sẽ giới thiệu cho các bạn cách sử các hàm map flatmap rất hữu dụng trong IOS swift khi xử lý các đối tượng collection
Map
Sử dụng phép xử lý map để lặp duyệt qua từng phần tử trong một collection, đồng thời sử dụng các phép biến đổi để thay đổi giá trị của từng phần tử. Kết quả cuối cùng của phép xử lý map là một mảng các phần tử của collection cũ sau khi áp dụng các phép biến đổi.
Bây giờ chúng ta tạo một mảng với đối tượng như thế này
struct Devices {
var type:String = ""
var price:Double = 0.0
var color:String = ""
}
let iDevices:[Devices] = [Devices(type: "I Mac pro", price: 100.0, color: "Space gray"),Devices(type: "Iphone", price: 10202.0, color: "Black"), ]
,,,
VD Bây giờ chúng ta muốn tính thuế của mỗi sản phẩm nhân 2 lần. Bình thường chúng ta sẽ sử dụng for để duyệt các các phần tử để nhân 2 như thế này
``` swift
var taxes:[Double] = []
for tax in iDevices {
taxes.append(tax.price * 2.0)
}
print("taxes result:",taxes)
Output
taxes result [200.0, 20404.0]
Trong swift cung cấp cho chúng ta hàm map dể xử lý trường hợp này ngắn gọn hơn
let result = iDevices.map({ return $0.price * 2.0 })
print("taxes result",result)
Output
taxes result [200.0, 20404.0]
Time complexity: O(n)
Fitter
Sử dụng phép xử lý filter duyệt qua tất cả các phần tử có trong collection và chỉ lấy ra các phần tử thoả mãn điều kiện cho trước và bổ sung vào mảng kết quả.
VD Bây giờ trong cái mảng iDevices này chúng ta muốn tìm ra loại thiết bị Iphone chẳng hạn chúng ta sẽ dùng fitter để lọc ra phần tử mình cần
let myIphone = iDevices.filter({return $0.type == "Iphone"})
print(myIphone)
Time complexity: O(n)
Reduce
Phép xử lý reduce được sử dụng để kết hợp tất cả các phần tử trong một collection thành một kết quả đầu ra
let totalVietnamese = myIphone.reduce(0,{ x, y in
x + y.price
})
print(totalVietnamese)
Time complexity: O(n)
Sorted
let sortedDescending = iDevices.sorted { (a, b) -> Bool in
a.price > a.price
}
print("Sorted descending \(sortedDescending)")
FlatMap
Biến một mảng chứa nhiều phần tử mảng, có cùng một kiểu dữ liệu, thành một mảng
Ví dụ chúng ta có 1 mảng gồm 2 phần tử là 2 mảng, chúng ta muốn kết hợp 2 mảng này lại thành 1 mảng
let number = [[1,2,3,4],[4,5,6,7]]
let flatNumbers = number.flatMap ({$0.sorted()})
print(" \(flatNumbers)")
compactMap
Trả về một mảng chứa non-nil được gọi khi chuyển đổi mỗi thành phần trong chuỗi
let possibleNumbers = ["1", "2", "three", "///4///", "5"]
let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
print(compactMapped)