Ios 过滤对象数组以删除在一个或多个属性中具有相同值的对象
我有一个快速的coreData对象数组。对象有三个属性。我想过滤数组以删除其中两个属性具有相同值的对象 对象属性为Object.name、Object.age、Object.id 所有属性都是字符串类型Ios 过滤对象数组以删除在一个或多个属性中具有相同值的对象,ios,arrays,swift,xcode,filter,Ios,Arrays,Swift,Xcode,Filter,我有一个快速的coreData对象数组。对象有三个属性。我想过滤数组以删除其中两个属性具有相同值的对象 对象属性为Object.name、Object.age、Object.id 所有属性都是字符串类型 我想过滤数组以返回一个数组,从而删除object.name和object.age相同的重复情况 这似乎是对我有效的解决方案。也许不是最优雅但足够简单 对象是coreData对象的数组。第二个数组objectsArray是一个空数组,它在嵌套迭代中填充了非年龄/名称重复项 var objects
我想过滤数组以返回一个数组,从而删除object.name和object.age相同的重复情况 这似乎是对我有效的解决方案。也许不是最优雅但足够简单 对象是coreData对象的数组。第二个数组objectsArray是一个空数组,它在嵌套迭代中填充了非年龄/名称重复项
var objects = [Object]()
//initialize the above array objects and fill with core data objects
objects = populateObjectsArrayWithCoreDataObjects()
//create a new empty array called objectsArray
var objectsArray = [Object]()
for index in 0..<self.objects.count {
let object = objects[index]
var isDuplicate = false
for index2 in (index + 1)..<self.objects.count {
let object2 = objects[index2]
if object.name == object2.name && object.age == object2.age {
isDuplicate = true
}
}
if isDuplicate == false {
objectsArray.append(item)
}
}
objects = objectsArray
var objects=[Object]()
//初始化上述数组对象并填充核心数据对象
objects=populateObjectsArrayWithCoreDataObjects()
//创建一个名为objectsArray的新空数组
var objectsArray=[Object]()
对于0..中的索引,您可以使用一组:
var uniqueValues = Set<String>()
objectsArray = objectsArray.filter{ uniqueValues.insert("\($0.name)|\($0.age)").inserted}
var uniqueValues=Set()
objectsArray=objectsArray.filter{uniqueValues.insert(“\($0.name)\\($0.age)”).inserted}
您还可以通过扩展数组类型来概括该方法以涵盖其他组合:
extension Array
{
func filterDuplicate<T>(_ keyValue:(Element)->T) -> [Element]
{
var uniqueKeys = Set<String>()
return filter{uniqueKeys.insert("\(keyValue($0))").inserted}
}
}
objectsArray = objectsArray.filterDuplicate{ ($0.name,$0.age) }
扩展数组
{
func filterDuplicate(ukeyValue:(元素)->T)->[元素]
{
var uniqueKeys=Set()
返回筛选器{uniqueKeys.insert(“\(keyValue($0))”)。inserted}
}
}
objectsArray=objectsArray.filterDuplicate{($0.name,$0.age)}
虽然Alain的解决方案非常好,但这里有一种更快捷的方法,它得益于KeyPaths:
extension Array {
func filterDuplicates(by keyPath: PartialKeyPath<Element>) -> Self {
var uniqueKeys = Set<String>()
return self.filter { uniqueKeys.insert("\($0[keyPath: keyPath])").inserted }
}
}
使用方法如下:
yourArr.filterDuplicates(by:\YourClass.propertyOneName,\YourClass.propertyWoName)
你的意思是你想要(姓名:Abc,年龄:20)
和(姓名:Abc,年龄:20)
中的一个对象,对吗?是的,没错。我想要其中一个具有相同名称和年龄的对象。请参考此内容,我不确定如何在coreData对象的链接中应用该解决方案,非常感谢。这是我一直在寻找的优雅解决方案。你救了我的命
extension Array {
func withRemovedDuplicates(by keyPaths: PartialKeyPath<Element>...) -> Self {
var uniqueKeys = Set<String>()
return self.filter { element in
uniqueKeys.insert(keyPaths.map { "\(element[keyPath: $0])" }.joined()).inserted
}
}
}