如何将NSDrray的NSArray转变为NSDictionarys的嵌套NSArray

can*_*boy 0 iphone objective-c nsarray ios

如果我有一个带有几个字典对象的NSArray(或可变数组)(每个字典都是Person),就像这样:

[
  { 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 }
]
Run Code Online (Sandbox Code Playgroud)

我如何将它分成四个数组的数组,按姓氏(并在该名称中)排序,如下所示:

[
    [ 
      { 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 }
    ]
]
Run Code Online (Sandbox Code Playgroud)

Dav*_*ong 6

你可以使用键值编码和谓词做一些非常整洁的东西......

//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]];
}
Run Code Online (Sandbox Code Playgroud)

Person只要字典具有@"surname"键或Person对象具有-(NSString *)surname方法,这将适用于对象(可能更好)或字典.