簡體   English   中英

iOS Swit 3-篩選器中的篩選器數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM