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
}
}