gpt4 book ai didi

ios - 希望使用过滤器方法使用 Swift 从数组中删除基于两个属性的重复模型对象

转载 作者:搜寻专家 更新时间:2023-11-01 05:56:06 24 4
gpt4 key购买 nike

我有一个从 JSON 数据创建的模型对象数组。我有数千条包含重复项的记录,我需要将其删除。如果一条记录具有相同的“名称”和相同的“地址”属性,则该记录被视为重复。

问题是,我知道如何删除重复对象的唯一方法是在 for 循环搜索中执行 for 循环,我想知道是否有更好、更有效的方法?我认为最好的方法是使用“过滤器”方法,但我很难将其配置为使用包含具有多个属性的模型对象的数组。

我的模型对象如下所示:

struct Person {

let id: Int
let name: String
let address: String


init(id:Int, name:String, address:String) {
self.id = id
self.name = name
self.address = address
}
}

我尝试在我的模型对象数组上使用过滤器方法的方式如下所示(我知道这是行不通的):

let uniqueArray = peopleArray.filter { $0.name == $1.name, $0.address == $1.address }

谁能看出我做错了什么?

最佳答案

1:你需要让你的结构符合Equatable协议(protocol)

func ==(lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name && lhs.address == rhs.address
}

2:您可以使用集合来控制从数组中过滤哪些对象,但您需要使您的结构符合 Hashable 协议(protocol)并向其添加 hashValue 属性。

struct Person: Equatable, Hashable {
let id: Int
let name: String
let address: String
init(id: Int, name: String, address: String) {
self.id = id
self.name = name
self.address = address
}
var hashValue: Int {
return name.hashValue ^ address.hashValue
}
}

3:用法

let people = [Person(id: 1, name: "Name A", address: "Address A"),
Person(id: 2, name: "Name B", address: "Address B"),
Person(id: 2, name: "Name B", address: "Address B"),
Person(id: 3, name: "Name C", address: "Address C")]

// Will keep the order
var set: Set<Person> = []
let orderedset = people.filter{ set.insert($0).inserted }
print(orderedset)

// Will not keep the order
let unique = Set<Person>(people)
print(unique)

提示:

如果 ID 是唯一的,您应该使用它来进行比较。

关于ios - 希望使用过滤器方法使用 Swift 从数组中删除基于两个属性的重复模型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com