2017-04-15 6 views
2

私はcoreDataオブジェクトのSwift配列を持っています。オブジェクトには3つのプロパティがあります。私はこれらのプロパティの2つの同じ値を共有するオブジェクトを削除する配列をフィルタリングしたいと思います。1つまたは複数のプロパティで同じ値を持つオブジェクトを削除するために、オブジェクトのフィルタを迅速に配列します。

オブジェクトのプロパティは、object.age object.nameあり、すべてのプロパティはString型である

をobject.id。

object.nameとobject.ageが同じ重複したケースを削除して配列を返すように配列をフィルタリングする必要があります。

+0

var uniqueValues = Set<String>() objectsArray = objectsArray.filter{ uniqueValues.insert("\($0.name)|\($0.age)").inserted} 

あなたはまた、配列型を拡張することによって、他の組み合わせをカバーするためのアプローチを一般化可能性(名前:Abc、年齢:20)と(名前:Abc、年齢:20)のオブジェクトは正しいのですか? –

+0

はい、正確です。同じ名前と年齢のオブジェクトのうちの1つが必要です。 – alionthego

+0

これを参照してくださいhttp://stackoverflow.com/questions/34709066/remove-duplicate-objects-in-an-array –

答えて

4

あなたはセットでそれを行うことができます:uはのいずれかをしたいあなたは意味

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オブジェクトの配列です。 2番目の配列objectsArrayは、ネストされた反復で、age/nameの重複しない項目で設定された空の配列です。

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 
関連する問題