Swift 数组相交 属性
Swift Array intersection by property
我正在尝试比较两个数组。一个数组是 Person
个对象的数组,每个对象都有一个 email
属性,即 String
电子邮件地址。另一个数组是一个 EmailAddress
对象,它有一个像 "work" 或 "personal" 这样的描述性词和实际的 String
电子邮件地址。
基本上这两个对象都有一个 String
属性 作为电子邮件地址。我想比较这些对象数组,看看每个数组中的对象之一是否具有相同的电子邮件地址。现在我正在使用嵌套的 for
循环,如下所示,但这花费的时间太长了。
for person in self.allPeople! {
for e in EmailAddresses! {
if e.value == person.email {
return true
}
}
}
我考虑过使用 set intersection,但看起来它只适用于比较相同的对象,而不适用于对象的属性。谢谢。
您仍然可以通过首先创建一组所有电子邮件来使用 Set
功能。 map
有助于将一个集合变成另一个集合,在这种情况下,将您的 allPeople
集合更改为这些人的 email
集合。这会更快,因为现在 EmailAddresses
迭代一次,而不是 per person.
let personEmails = Set(self.allPeople!.map { [=10=].email })
let matchingEmails = EmailAddresses!.map { [=10=].value }
return !personEmails.isDisjoint(with: matchingEmails)
我正在尝试比较两个数组。一个数组是 Person
个对象的数组,每个对象都有一个 email
属性,即 String
电子邮件地址。另一个数组是一个 EmailAddress
对象,它有一个像 "work" 或 "personal" 这样的描述性词和实际的 String
电子邮件地址。
基本上这两个对象都有一个 String
属性 作为电子邮件地址。我想比较这些对象数组,看看每个数组中的对象之一是否具有相同的电子邮件地址。现在我正在使用嵌套的 for
循环,如下所示,但这花费的时间太长了。
for person in self.allPeople! {
for e in EmailAddresses! {
if e.value == person.email {
return true
}
}
}
我考虑过使用 set intersection,但看起来它只适用于比较相同的对象,而不适用于对象的属性。谢谢。
您仍然可以通过首先创建一组所有电子邮件来使用 Set
功能。 map
有助于将一个集合变成另一个集合,在这种情况下,将您的 allPeople
集合更改为这些人的 email
集合。这会更快,因为现在 EmailAddresses
迭代一次,而不是 per person.
let personEmails = Set(self.allPeople!.map { [=10=].email })
let matchingEmails = EmailAddresses!.map { [=10=].value }
return !personEmails.isDisjoint(with: matchingEmails)