我正在根据包含的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次
当前仅返回一个
答案 0 :(得分:0)
由于您的代码本身不是“有效”的代码,因此我们可以假设您具有Service
和Item
结构。
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)
}
}