Ios 使用Swift中的属性和贴图筛选自定义对象数组

Ios 使用Swift中的属性和贴图筛选自定义对象数组,ios,arrays,swift,filter,higher-order-functions,Ios,Arrays,Swift,Filter,Higher Order Functions,我的模型课如下: struct Job: Decodable, Equatable, Hashable { var id: Int? var status: String? var priority: String? } 我有两个对象数组(作业),如下所示: 案例:作业模型有5个元素filteredJobModel有2个元素(jobModel的子集)。在filteredJobModel中,两个对象的status值都已通过search操作更改。 我想用filteredJobMo

我的模型课如下:

struct Job: Decodable, Equatable, Hashable {
   var id: Int?
   var status: String?
   var priority: String?
}
我有两个对象数组(作业),如下所示:

案例
作业模型
有5个元素
filteredJobModel
有2个元素(jobModel的子集)。在
filteredJobModel
中,两个对象的
status
值都已通过
search
操作更改。 我想用
filteredJobModel
更新
jobModel
,其中对象与
id
属性匹配

我有什么办法可以办到这个案子吗?我本来可以对[String]使用过滤器&映射,但是,我想知道如何为自定义对象数组实现更高阶的函数

for (index, job) in idsJobModel.enumerated() {
    if let match = arrFiltetered.first( where: {job.id == $0.id} ) {
     idsJobModel[index] = match
   }
}
或者,如果您喜欢使用地图:

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

上述任一版本的代码都将具有
O(n²)
性能,因此随着阵列的增大,其速度将显著降低≈30个要素。需要对其进行调整,以便在较大的数组上运行良好。

假设idsJobModel中的
id
值始终是唯一的(且从不为零),则可以通过使用id作为键将arrfiltered数组映射到字典中来提高上述性能。然后,您将在idsJobModel中循环,对每个ID进行字典查找,并替换idsJobModel中的条目(字典查找几乎是
O(1)
,这样可以将性能提高到大约
O(n)
,这是一个巨大的改进。即使您的id值不是唯一的,您也可以实现一个自定义哈希函数,该函数排除您的(可更改的)状态属性,并在上述速度优化中使用哈希作为字典键。
idsJobModel = idsJobModel.map {
    let myID = $0.id
    if let match = arrFiltetered.first( where: {myID == $0.id} ) {
        return match
    } else {
        return $0
    }
}