简体   繁体   English

在 Swift 中使用属性和 Map 过滤自定义对象数组

[英]Filter array of custom objects with an attribute and Map in Swift

My model class is as below:我的模型类如下:

struct Job: Decodable, Equatable, Hashable {
   var id: Int?
   var status: String?
   var priority: String?
}

I have 2 array of objects(job) as:我有 2 个对象数组(工作)为:

 var jobModel = [Job]()
 var filteredJobModel = [Job]()

Case : jobModel has 5 elements.案例jobModel有 5 个元素。 filteredJobModel has 2 elements( subset of jobModel ). filteredJobModel有 2 个元素( jobModel的子集)。 In filteredJobModel , the value for status for both objects has been changed by search operation.filteredJobModel中,两个对象的status值已被search操作更改。 I would like to update the jobModel back with filteredJobModel , where the object matches the id attribute.我想用filteredJobModel更新jobModel ,其中对象与id属性匹配。

Is there any way by which I can achieve this case?有什么办法可以实现这种情况吗? I would have been able to use filter & map for [String], but, I would like to know how to implement higher order functions for array of custom objects.我本来可以为 [String] 使用过滤器映射,但是,我想知道如何为自定义对象数组实现高阶函数。

for (index, job) in idsJobModel.enumerated() {
    if let match = arrFiltetered.first( where: {job.id == $0.id} ) {
     idsJobModel[index] = match
   }
}

Or if you prefer using map:或者,如果您更喜欢使用地图:

idsJobModel = idsJobModel.map {
    let myID = $0.id
    if let match = arrFiltetered.first( where: {myID == $0.id} ) {
        return match
    } else {
        return $0
    }
}

Either version of the code above will have O(n²) performance, so it will get dramatically slower as your arrays get larger than ≈30 elements.上面代码的任一版本都将具有O(n²)性能,因此当您的数组大于 ≈30 个元素时,它会变得非常慢。 It would need to be tweaked to perform well on larger arrays.它需要进行调整才能在更大的阵列上表现良好。

you can do like this 你可以这样

let idsJobModel = filteredJobModel.map { $0.id }
let arrFiltetered  = jobModel.filter { !idsJobModel.contains($0.id) }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM