Как превратить NSArray из NSDictionarys во вложенный NSArray из NSDictionarys - PullRequest
0 голосов
/ 21 октября 2010

Если у меня есть 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 }
]

Как бы я разделил его на массив из четырех массивов, отсортированных по фамилии (и в пределах этого имени), вот так:

[
    [ 
      { 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 }
    ]
]

Ответы [ 2 ]

6 голосов
/ 21 октября 2010

Вы можете сделать несколько довольно изящных вещей, используя кодирование значения ключа и предикаты ...

//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]];
}

Это будет работать либо для объекта Person (что было бы лучше), либо для словарей, еслипоскольку словари имеют ключ @"surname" или объект Person имеет метод -(NSString *)surname.

2 голосов
/ 21 октября 2010

Вы должны использовать специализированный класс Person вместо NSDictionary.


Вы можете сначала сгруппировать его в словарь массивов словарей, например

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;

Вы можете использовать [result allValues], если вам действительно нужен массив.

Если вам нужен отсортированный массив, вам нужно отсортировать его вручную:

NSArray* sortedSurnames = [[result allKeys] sortedArrayUsingSelector:@selector(compare:)];
return [result objectsForKeys:sortedSurnames notFoundMarker:[NSNull null]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...