我想通过特定属性创建唯一元素的数组。
前:
我有对象数组(Person):
struct Person {
var name: String?
var secondName: String?
init (name: String, secondName: String) {
self.name = name
self.secondName = secondName
}
}
let person1 = Person(name: "name1", secondName: "secondName1")
let person2 = Person(name: "name2", secondName: "secondName2")
let person3 = Person(name: "name1", secondName: "secondName3")
let personsArray = [person1, person2, person3]
我想获得一个新数组,它将包含具有唯一名称的人物对象
类似这样的$ 0.name == $ 1.name
实现这一目标的最佳方法是什么?
结果应该是具有唯一名称的对象数组param = [[person1,person3],[person2]]
答案 0 :(得分:1)
给定一个Person(s)
数组,您需要输出多个词典,其中键是一个人的名字,而值是一个人员列表那个名字。
这是代码
let dict = persons.reduce([String:[Person]]()) { (dict, person) -> [String:[Person]] in
var dict = dict
dict[person.name] = (dict[person.name] ?? []) + [person]
return dict
}
答案 1 :(得分:1)
一种方法:您可以将它们逐个添加到字典中,其中“name”是键(考虑使用小写),“数组人员”是值。完成后,keys数组将包含所有唯一的“name”值,每个键的值将是具有该“name”的Persons数组。然后,您可以通过删除任何具有小于2的数组的键来“修剪”您的字典。
替代方法:按“名称”对数组进行排序,然后您可以轻松删除任何未出现两次的内容(如果某个元素与其中一个邻居不匹配,则将其删除)。