我有一个Swift数组coreData对象。这些对象有三个属性。我想过滤数组以删除共享这些属性中的2个相同值的对象。筛选swift对象数组以删除在其一个或多个属性中具有相同值的对象
对象属性是object.name,object.age,object.id
所有属性String类型。
我想过滤数组返回一个数组,删除重复的情况,其中object.name和object.age是相同的。
我有一个Swift数组coreData对象。这些对象有三个属性。我想过滤数组以删除共享这些属性中的2个相同值的对象。筛选swift对象数组以删除在其一个或多个属性中具有相同值的对象
对象属性是object.name,object.age,object.id
所有属性String类型。
我想过滤数组返回一个数组,删除重复的情况,其中object.name和object.age是相同的。
你可以用一组做:
var uniqueValues = Set<String>()
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) }
非常感谢。这是我寻找的优雅解决方案。 – alionthego
你救了我的命<3 –
这是似乎为我工作的解决方案。也许不是最优雅但很简单的。
objects是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
你的意思是ü希望之一“(名字:Abc,年龄:20)'和'(名字:Abc,年龄:20)”的对象? –
是的,确切地说。我想要一个具有相同名称和年龄的对象。 – alionthego
请参阅http://stackoverflow.com/questions/34709066/remove-duplicate-objects-in-an-array –