基于内容计数快速返回数组

时间:2020-10-18 14:29:06

标签: swift

我正在根据包含的ID过滤数组。我在数组中有四个项目,它们的id不同,但是serviceId相同,我在过滤基本数组时检查ID是否与另一个数组中的一个匹配。

    let flattenArray = [
       {
          "id":1,
          "name":"abc"
       },
       {
          "id":2,
          "name":"joe"
       },
       {
          "id":3,
          "name":"aby"
       }
    ]

struct MainElement: Codable {
    var id: Int?
    var name: String?

}

typealias Main = [MainElement]
        
        let toFilter = [
       {
          "id":"1a",
          "serviceId":1
       },
       {
          "id":"1b",
          "serviceId":1
       },
       {
          "id":"1c",
          "serviceId":1
       },
       {
          "id":"1d",
          "serviceId":1
       }
    ]

// MARK: - ServiceElement
struct ServiceElement: Codable {
    var id: String?
    var serviceId: Int?
}

typealias Service = [ServiceElement]

        let filteredBill = Array(flattenArray).filter { service in
                        toFilter.contains(where: { $0.serviceId == service.id        })}

我希望过滤后的帐单成为[{"id": 1, "name": "abc"}, {"id": 1, "name": "abc"}, {"id": 1, "name": "abc"}, {"id": 1, "name": "abc"}] ,因为serviceId出现了4次

当前仅返回一个

1 个答案:

答案 0 :(得分:0)

由于您的代码本身不是“有效”的代码,因此我们可以假设您具有ServiceItem结构。

struct Service {
    let id: Int
    let name: String
}

struct Item {
    let id: String
    let serviceId: Int
}

然后我们填充:

let services = [Service(id: 1, name: "abc"),
                Service(id: 2, name: "joe"),
                Service(id: 3, name: "aby")]
let items = [Item(id: "1a", serviceId: 1),
             Item(id: "1b", serviceId: 1),
             Item(id: "1v", serviceId: 1),
             Item(id: "1d", serviceId: 1)]

要获得结果,我想您需要一个Service数组中的一个Item数组。

因此,您需要转换而不是过滤。所以是map() / compactMap(),而不是filter()

let transformed = items.compactMap { anItem in
    return services.first(where: { $0.id == anItem.serviceId })
}

说明:

对于Item中的每个items,我们检查Service中是否有相应的services。如果在其中,则返回找到的Service,否则,我们返回nil(并且不将其添加到转换中)。

有关for循环的更多手册:

var transformed = [Service]()
for (_, anItem) in items.enumerated() {
    if let serviceFound = services.first(where: { $0.id == anItem.serviceId }) {
        transformed.append(serviceFound)
    }
}