2010-10-21 9 views
0

Si j'ai un NSArray (ou un tableau mutable) avec plusieurs objets dictionnaire (chaque dictionnaire est une personne) comme ceci:Comment transformer NSArray de NSDictionarys dans une nichée NSArray de NSDictionarys

[ 
    { forename: chris, surname: smith, age: 22 } 
    { forename: paul, surname: smith, age: 24 } 
    { forename: dave, surname: jones, age: 21 } 
    { forename: alan, surname: jones, age: 26 } 
    { forename: cecil, surname: reeves, age: 32 } 
    { forename: pablo, surname: sanchez, age: 42 } 
] 

Comment pourrais-je séparer dans un tableau de quatre tableaux, triés par nom (et dans ce prenom), comme suit:

[ 
    [ 
     { forename: alan, surname: jones, age: 26 } 
     { forename: dave, surname: jones, age: 21 } 
    ] 
    [ 
     { forename: cecil, surname: reeves, age: 32 } 
    ] 
    [ 
     { forename: pablo, surname: sanchez, age: 42 } 
    ] 
    [ 
     { forename: chris, surname: smith, age: 22 } 
     { forename: paul, surname: smith, age: 24 } 
    ] 
] 

Répondre

6

Vous pouvez faire des choses assez propre en utilisant le codage et prédicats valeur clé ...

//retrieve an array of the distinct surnames 
NSArray * distinctSurnames = [peopleArray valueForKeyPath:@"@distinctUnionOfObjects.surname"]; 
//at this point, if you need the surnames in a specific order, you can do so here. 

NSMutableArray * groupedPeople = [NSMutableArray array]; 

//for each of the surnames... 
for (NSString * surname in distinctSurnames) { 
    //create a predicate to only find people with this surname 
    NSPredicate * filter = [NSPredicate predicateWithFormat:@"surname = %@", surname]; 
    //retrieve only the people with this surname and add them to the final array 
    [groupedPeople addObject:[peopleArray filteredArrayUsingPredicate:filter]]; 
} 

Cette fonctionnera pour un objet Person (ce qui serait mieux) ou des dictionnaires, tant que les dictionnaires ont une clé @"surname" ou l'objet Person a une méthode -(NSString *)surname.

+0

Une solution géniale! Pas assez de gens utilisent KVC. Vraiment lisse. –

2

Vous devez utiliser une classe de personne spécialisée, au lieu d'un NSDictionary.


Vous pouvez d'abord le regrouper dans le dictionnaire de tableaux de dictionnaires, par ex.

NSMutableDictionary* result = [NSMutableDictionary dictionary]; 
for (Person* person in peopleArray) { 
    NSString* surname = person.surname; 
    NSMutableArray* surnameArray = [result objectForKey:surname]; 
    if (surnameArray == nil) { 
     [result setObject:[NSMutableArray arrayWithObject:person] 
        forKey:surname]; 
    } else { 
     [surnameArray addObject:person]; 
    } 
} 
return result; 

Vous pouvez utiliser [result allValues] si vous avez vraiment besoin d'un tableau.

Si vous avez besoin d'un tableau trié, vous devez trier manuellement:

NSArray* sortedSurnames = [[result allKeys] sortedArrayUsingSelector:@selector(compare:)]; 
return [result objectsForKeys:sortedSurnames notFoundMarker:[NSNull null]];