2017-04-15 63 views
2

我有一个Swift数组coreData对象。这些对象有三个属性。我想过滤数组以删除共享这些属性中的2个相同值的对象。筛选swift对象数组以删除在其一个或多个属性中具有相同值的对象

对象属性是object.name,object.age,object.id

所有属性String类型。

我想过滤数组返回一个数组,删除重复的情况,其中object.name和object.age是相同的。

+0

你的意思是ü希望之一“(名字:Abc,年龄:20)'和'(名字:Abc,年龄:20)”的对象? –

+0

是的,确切地说。我想要一个具有相同名称和年龄的对象。 – alionthego

+0

请参阅http://stackoverflow.com/questions/34709066/remove-duplicate-objects-in-an-array –

回答

4

你可以用一组做:

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) } 
+1

非常感谢。这是我寻找的优雅解决方案。 – alionthego

+0

你救了我的命<3 –

0

这是似乎为我工作的解决方案。也许不是最优雅但很简单的。

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 
相关问题