[英]iOS Swit 3 - filter array inside filter
我想在過濾器中過濾數組。 首先,我有大量的Staff對象(self.bookingSettings.staffs)。 在這個數組中,我有多個這樣的對象:
"staffs": [
{
"id": 1,
"name": "Brian",
"services": [
{
"id": 1
},
{
"id": 2
},
{
"id": 3
},
{
"id": 4
}
],
"pos": 1
},...
我想過濾此數組,以便僅具有id = 3
服務。
我成功擁有了第一個對象等於3
代碼:
self.bookingSettings.staffs.filter({ $0.services.first?.id == self.bookingService.id })
但這只需要第一項。
我認為我必須在我的過濾器函數中進行過濾,這樣的事情才能遍歷服務中的所有對象:
self.bookingSettings.staffs.filter({ $0.services.filter({ $0.id == self.bookingService.id }) })
但是出現以下錯誤: Cannot convert value of type [BookingService] to closure result type Bool.
這是一個好主意嗎 ? 我該如何實現?
您可以使用filter
,看起來像這樣:
self.bookingSettings.staffs.filter {
!$0.services.filter{ $0.id == self.bookingService.id }.isEmpty
}
這段代碼正在構造一個完整的過濾結果數組,只是檢查它是否為空並立即將其丟棄。 由於filter返回與列表中的謂詞匹配的所有項目,因此在找到匹配項后(它實際上就是您要查找的)不會停止。 因此,即使一百萬個元素列表中的第一個元素匹配,它仍然會繼續檢查999,999個元素。 如果其他999,999元素也匹配,那么他們都將被復制到filter
的結果。 這很愚蠢,在這種情況下可以使用更多的CPU和RAM。
您只需要contains(where:)
:
self.bookingSettings.staffs.filter {
$0.services.contains(where: { $0.id == self.bookingService.id })
}
contains(where:)
短路,這意味着在找到匹配項后它不會繼續檢查元素。 一旦找到匹配項,它將停止並返回true。 它還不會同時將匹配的元素復制到新列表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.