ios 多标签嵌套数组中的过滤器数组

toiithl6  于 2022-12-24  发布在  iOS
关注(0)|答案(1)|浏览(99)
class TrackingItem : ObservableObject, Identifiable, Codable {
    var id = UUID()
    var trackingNumber: String?
} 

struct ToMeTabResponse : Codable {
    var shipments: [TrackingItem] = []
}       
        
struct ObjectData : Codable {
    var groups: [ToMeTabResponse] = []
}
    
struct BaseViewModel {     
    var objectList: [ObjectData] = []
    var ignoreIds: [String] = ["AB","BC" ]

此函数filter未返回预期结果。如果trackingNumberignoreIds中,则该对象不应在objectList中。

func filter
    objectList = objectList.filter { list in
        list.groups.contains(where: {
            $0.shipments.contains(where: { 
                !ignoreIds.contains($0.trackingNumber ?? "")
            })
        })
    }
}
yyhrrdl8

yyhrrdl81#

如果您的目标是过滤掉任何ObjectData示例,该示例包含具有忽略ID的装运的任何组,则可以使用以下命令:

objectList = objectList.filter { data in
        data.groups.allSatisfy({
            $0.shipments.allSatisfy({
                !ignoreIds.contains($0.trackingNumber ?? "")
            })
        })
    }

allSatisfy的使用确保所有条目满足期望的标准。因此,如果要忽略给定ObjectData的所有组的所有装运中的单个TrackingItem,则整个ObjectData将从结果中过滤掉。
如果您的目标是创建一个新的数据副本,只删除匹配的TrackingItem示例(以及空的发货和组),那么这就复杂得多了。
filter(by:)方法已添加到and中,以使其更易于管理。
以下项目可以在Swift Playground中运行。

struct TrackingItem : Codable {
    var id = UUID()
    var trackingNumber: String?
}

struct ToMeTabResponse : Codable {
    var shipments: [TrackingItem] = []

    // Create a copy of self while filtering out matching shipments
    func filter(by ids: [String]) -> Self {
        return ToMeTabResponse(shipments: shipments.filter { !ids.contains($0.trackingNumber ?? "") })
    }
}

struct ObjectData : Codable {
    var groups: [ToMeTabResponse] = []

    // Create a copy of self filtering out empty shipments
    func filter(by ids: [String]) -> Self {
        return ObjectData(groups: groups.map { $0.filter(by: ids) }.filter { !$0.shipments.isEmpty })
    }
}

struct BaseViewModel {
    var objectList: [ObjectData] = []
    var ignoreIds: [String] = ["AB","BC" ]

    // Update objectList by filtering out matching TrackingItems and removing ObjectData instances with empty groups
    mutating func filter() {
        objectList = objectList.map { $0.filter(by: ignoreIds) }.filter { !$0.groups.isEmpty }
    }
}

var x = BaseViewModel()
x.objectList = [
    ObjectData(groups: [
        ToMeTabResponse(shipments: [
            TrackingItem(trackingNumber: "AB"),
            TrackingItem(trackingNumber: "XY"),
        ]),
        ToMeTabResponse(shipments: [
            TrackingItem(trackingNumber: "GF"),
            TrackingItem(trackingNumber: "HY"),
        ]),
    ]),
    ObjectData(groups: [
        ToMeTabResponse(shipments: [
            TrackingItem(trackingNumber: "QW"),
            TrackingItem(trackingNumber: "NN"),
        ]),
        ToMeTabResponse(shipments: [
            TrackingItem(trackingNumber: "TT"),
            TrackingItem(trackingNumber: "OO"),
        ]),
    ]),
    ObjectData(groups: [
        ToMeTabResponse(shipments: [
            TrackingItem(trackingNumber: "HG"),
            TrackingItem(trackingNumber: "JU"),
        ]),
        ToMeTabResponse(shipments: [
            TrackingItem(trackingNumber: "AB"),
            TrackingItem(trackingNumber: "BC"),
        ]),
    ]),
    ObjectData(groups: [
        ToMeTabResponse(shipments: [
            TrackingItem(trackingNumber: "BC"),
            TrackingItem(trackingNumber: "AB"),
        ]),
        ToMeTabResponse(shipments: [
            TrackingItem(trackingNumber: "AB"),
            TrackingItem(trackingNumber: "BC"),
        ]),
    ]),
]

x.filter()
print(x.objectList)

相关问题