【发布时间】:2018-10-16 07:42:06
【问题描述】:
我正在寻找可以将对象数组(对象是类而不是结构)添加到现有数组中的有效算法。要求是如果现有数组包含具有相同id 的对象,该函数将更新该对象(根据更新的对象更改现有对象的属性)。如果object.id 不包含在现有数组中,该函数将简单地将该对象添加到现有数组中。返回数组由新对象和更新对象组成。
如果object.id 是新的,基本上只添加对象。如果 object.id 已经包含,它将更新对象的属性
我在下面试试
func addPhotoArray(_ photos: [Photo], addedPhoto: [Photo]) -> [Photo]{
var resultArray = photos
let originalIds = photos.map{$0.id}
for photo in addedPhoto {
if !originalIds.contains(photo.id) {
resultArray.append(photo)
}
}
return resultArray
}
但我缺少更新要求。我该如何解决这个问题?
更新
用索引替换项目是一种选择。但不确定如果只有 1 或 2 个属性发生变化或根本没有变化,它是否有效。我也在考虑使用Set。如何符合hashable,我们可以使用union函数如下
extension Photo {
static func union (left: [Photo],right: [Photo] ) -> [Photo]{
return Array(Set(left).union(Set(right)))
}
static func ==(lhs: Photo, rhs: Photo) -> Bool {
return lhs.id == rhs.id
}
}
【问题讨论】:
-
为什么不使用以
photo.id为关键字的字典呢?在我看来,它会更好地满足您的目的 -
关于您的更新,如果您想要使用 Hashable 的解决方案,您应该提出一个新问题,但据我所知,您将拥有一个完全替换对象的解决方案。
-
谢谢你的意思是使用 Set 我们最终也会替换现有的项目?