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

Ios 希望使用过滤器方法,使用Swift从数组中删除基于两个属性的重复模型对象,ios,arrays,swift,Ios,Arrays,Swift,我有一个由JSON数据创建的模型对象数组。我有数千条包含重复项的记录,需要删除这些记录。如果记录具有相同的“名称”和相同的“地址”属性,则该记录被视为重复记录 问题是,我知道如何删除重复对象的唯一方法是在for循环搜索中执行for循环,我想知道是否有更好、更有效的方法?我认为最好的方法是使用“filter”方法,但我很难将其配置为使用包含多个属性的模型对象的数组 我的模型对象如下所示: struct Person { let id: Int let name: String

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

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

我的模型对象如下所示:

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
    }
}
我尝试在模型对象数组上使用filter方法的方式如下(我知道这不起作用):


有人知道我做错了什么吗

1:您需要使结构符合equalable协议

func ==(lhs: Person, rhs: Person) -> Bool {
    return lhs.name == rhs.name && lhs.address == rhs.address
}
2:您可以使用集合来控制从数组中筛选哪些对象,但需要使结构符合哈希协议,并向其添加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)
let people=[个人(id:1,姓名:“姓名A”,地址:“地址A”),
此人(身份证号码:2,姓名:“姓名B”,地址:“地址B”),
此人(身份证号码:2,姓名:“姓名B”,地址:“地址B”),
人员(身份证号码:3,姓名:“姓名C”,地址:“地址C”)]
//我会遵守秩序的
变量集:集=[]
让orderedset=people.filter{set.insert($0.inserted}
打印(订购集)
//我不会遵守秩序的
让唯一=设置(人)
打印(唯一)
提示:


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

1:您需要使结构符合equalable协议

func ==(lhs: Person, rhs: Person) -> Bool {
    return lhs.name == rhs.name && lhs.address == rhs.address
}
2:您可以使用集合来控制从数组中筛选哪些对象,但需要使结构符合哈希协议,并向其添加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)
let people=[个人(id:1,姓名:“姓名A”,地址:“地址A”),
此人(身份证号码:2,姓名:“姓名B”,地址:“地址B”),
此人(身份证号码:2,姓名:“姓名B”,地址:“地址B”),
人员(身份证号码:3,姓名:“姓名C”,地址:“地址C”)]
//我会遵守秩序的
变量集:集=[]
让orderedset=people.filter{set.insert($0.inserted}
打印(订购集)
//我不会遵守秩序的
让唯一=设置(人)
打印(唯一)
提示:


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

我收到错误消息,“上下文闭包类型”(Person)->Bool'需要一个参数,但闭包正文中使用了两个参数。我需要删除集合中存在的重复项,以便筛选的集合只包含唯一的模型对象。我不想一次只检查一对名称和地址。@syedfa,检查我更新的答案。我收到错误消息,“上下文闭包类型“(Person)->Bool”需要一个参数,但闭包正文中使用了两个参数。我需要删除集合中存在的重复项,以便筛选后的集合仅包含唯一的模型对象。我不想一次只检查一对姓名和地址。@syedfa,检查我的最新答案。这就是方法。不过,您可以简化步骤3。只要让unique=Set(peopleArray)就可以了。使用阵列创建集合将自动删除重复项。非常感谢您的解决方案!这就是路。不过,您可以简化步骤3。只要让unique=Set(peopleArray)就可以了。使用阵列创建集合将自动删除重复项。非常感谢您的解决方案!