NSArray *array = @[@{@"groupId" : @"1", @"name" : @"matt"},
@{@"groupId" : @"2", @"name" : @"john"},
@{@"groupId" : @"3", @"name" : @"steve"},
@{@"groupId" : @"4", @"name" : @"alice"},
@{@"groupId" : @"1", @"name" : @"bill"},
@{@"groupId" : @"2", @"name" : @"bob"},
@{@"groupId" : @"3", @"name" : @"jack"},
@{@"groupId" : @"4", @"name" : @"dan"},
@{@"groupId" : @"1", @"name" : @"kevin"},
@{@"groupId" : @"2", @"name" : @"mike"},
@{@"groupId" : @"3", @"name" : @"daniel"},
];
NSMutableArray *resultArray = [NSMutableArray new];
NSArray *groups = [array valueForKeyPath:@"@distinctUnionOfObjects.groupId"];
for (NSString *groupId in groups)
{
NSMutableDictionary *entry = [NSMutableDictionary new];
[entry setObject:groupId forKey:@"groupId"];
NSArray *groupNames = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"groupId = %@", groupId]];
for (int i = 0; i < groupNames.count; i++)
{
NSString *name = [[groupNames objectAtIndex:i] objectForKey:@"name"];
[entry setObject:name forKey:[NSString stringWithFormat:@"name%d", i + 1]];
}
[resultArray addObject:entry];
}
NSLog(@"%@", resultArray);
Output:
(
{
groupId = 3;
name1 = steve;
name2 = jack;
name3 = daniel;
},
{
groupId = 4;
name1 = alice;
name2 = dan;
},
{
groupId = 1;
name1 = matt;
name2 = bill;
name3 = kevin;
},
{
groupId = 2;
name1 = john;
name2 = bob;
name3 = mike;
}
)