2014-01-04 6 views
4

Я пытаюсь отфильтровать NSArray из NSDictionaries. В моем примере ниже я хочу dict1, dict2 & dict4 сгруппирован в один массив, dict3 & dict5 сгруппирован во второй массив и dict6 в третьем массиве.Группировка NSArray из NSDictionary на основе ключа в NSDictionay

Я получаю эти данные в NSArray, поэтому по существу массив «orig» ниже - это мой вход, и я знаю, что мне нужно делать группировку на основе «Name».

Вместо того, чтобы перебирать NSArray, я использую valueForKeyPath для возврата массива на основе пути ключа, но это не работает (сбой с журналами - [NSMutableArray addObjectsFromArray:]: аргумент массива не является NSArray ').

Любое предложение.

NSDictionary *dict1 = @{@"Name" : @"T1", @"Age" : @"25"}; 
NSDictionary *dict2 = @{@"Name" : @"T1", @"Age" : @"25"}; 
NSDictionary *dict3 = @{@"Name" : @"T2", @"Age" : @"27"}; 
NSDictionary *dict4 = @{@"Name" : @"T1", @"Age" : @"25"}; 
NSDictionary *dict5 = @{@"Name" : @"T2", @"Age" : @"27"}; 
NSDictionary *dict6 = @{@"Name" : @"T3", @"Age" : @"28"}; 

NSArray *orig = @[dict1, dict2, dict3, dict4, dict5, dict6]; 

NSMutableArray *final = [NSMutableArray array]; 

final = [orig valueForKeyPath:@"@unionOfArrays.Name"]; 

NSLog(@"Final = %@", final); 

ответ

4

Это немного трудно сказать, если то, что вы хотите три различных массивов, где каждый из них содержит только записи с определенным Name значением (как предлагает первый абзац), или если вы хотите один массив, в котором элементы являются отсортировано по Name (как предлагает ваш второй абзац). Независимо от того,

Для сортировки orig по значению Name поля:

NSArray *sortedByName = [orig sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"Name" ascending:YES]]]; 

Чтобы получить новый массив, выбрав только записи с определенным значением для Name:

NSArray *t1Only = [orig filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"Name = %@", @"T1"]]; 
+0

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

3

Если желаемый output - массив массивов, вы можете получить там, построив словарь с ключом атрибута name в словарях orig:

- (NSArray *)collateByName:(NSArray *)original { 

    NSMutableDictionary *collate = [NSMutableDictionary dictionary]; 
    for (NSDictionary *d in original) { 
     NSString *newKey = d[@"Name"]; 
     NSMutableArray *newValue = collate[newKey]; 
     if (!newValue) { 
      newValue = [NSMutableArray array]; 
      collate[newKey] = newValue; 
     } 
     [newValue addObject:d]; 
    } 
    return [collate allValues]; 
} 

Это немного подробный, но ясный, я думаю. Если вы хотите, чтобы атрибут отличался программным путем, передайте другой параметр, называемый атрибутом, и замените его буквой @ «Name».

+0

Спасибо! На самом деле я искал что-то без цикла FOR. Я уверен, что это должно сработать! Upvoting! – Abhinav

+0

Рад, что это немного полезно. Требование является внутренне итеративным. Другой подход может скрыть цикл, но цикл будет в решении где-то, возможно (и я согласен предпочтительно), скрытом в SDK-методе. – danh

+0

спас мой день! – user3236289

Смежные вопросы