IOS NSDictionary array: valores y keys de agrupación

Tengo el siguiente resultado de NSDictionary of Array

 Bath = { Keynsham = ( "nsham companies" ); }; Bath = { "Midsomer Norton" = ( "Keynsham companies" ); }; Bath = { "Norton Radstock" = ( "Keynsham taxi companies" ); }; Birmingham = { "Acock's Green" = ( "Acock's Green taxi companies" ); }; Birmingham = { "Alcester Lane's End" = ( "Alcester Lane's End taxi companies" ); }; 

¿Cómo puedo combinar los valores y las keys para que termine con una sola categoría como se muestra a continuación?

 Bath = { "Norton Radstock" = ( "Keynsham taxi companies" ); "Midsomer Norton" = ( "Keynsham companies" ); Keynsham = ( "nsham companies" ); }; 

No estoy seguro de si esta es la mejor manera de explicarlo, el código es el siguiente

// todos los Nssarrays asignados / inicializados

  NSURL *url=[NSURL URLWithString:@"http://y.php"]; NSData *data= [NSData dataWithContentsOfURL:url]; NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:Nil]; //instantiate arrays to hold data NSMutableDictionary *dictArray=[[NSMutableDictionary alloc]init]; NSArray *cityName=[[NSArray alloc]init]; NSArray *townName=[[NSArray alloc]init]; NSArray *taxis=[[NSArray alloc]init]; NSArray *ids=[[NSArray alloc]init]; for (int i=0; i<json.count; i++) { //cityName=[[NSMutableArray alloc] initWithCapacity:json.count]; ids = [[json objectAtIndex:i] objectForKey:@"id"]; cityName = [[json objectAtIndex:i] objectForKey:@"cityName"]; townName=[[json objectAtIndex:i] objectForKey:@"townName"]; taxis=[[json objectAtIndex:i] objectForKey:@"taxis"]; NSMutableArray *taxisArray=[[NSMutableArray alloc] initWithObjects:taxis,nil]; NSMutableDictionary *towensdict=[[ NSMutableDictionary alloc] initWithObjectsAndKeys:taxisArray,townName, nil]; NSMutableDictionary *cities1=[[NSMutableDictionary alloc] initWithObjectsAndKeys:towensdict,cityName, nil]; NSLOG (@"%@", cities1) here, gives me the print out above [dictArray addEntriesFromDictionary:cities1 ]; Then I tried Jdodgers solution as follows; NSMutableDictionary *combinedDictionary = [[NSMutableDictionary alloc] init]; for (NSDictionary *currentDictionary in dictArray) { NSArray *keys = [currentDictionary allKeys]; for (int n=0;n<[keys count];n++) { NSMutableDictionary *dictionaryToAdd = [combinedDictionary valueForKey:[keys objectAtIndex:n]]; if (!dictionaryToAdd) dictionaryToAdd = [[NSMutableDictionary alloc] init]; [dictionaryToAdd setValuesForKeysWithDictionary:[currentDictionary valueForKey:[keys objectAtIndex:n]]]; [combinedDictionary setValue:dictionaryToAdd forKey:[keys objectAtIndex:n]]; NSLog(@"%@", currentDictionary); } } 

// esto da error "selector no reconocido enviado a instancia", aquí está la printing

 combinedDictionary NSMutableDictionary * 0x000000010012e580 currentDictionary NSDictionary *const 0x0000000100116460 dictArray NSMutableDictionary * 0x000000010012e220 [0] key/value pair key id 0x0000000100116460 [0] id value id 0x000000010012e440 [0] id keys NSArray * 0x0000000000000000 

Podrías crear un NSMutableDictionary y recorrer tu matriz, agregando las keys al dictionary mutable usando allKeys .

Por ejemplo, si su matriz se llamó dictArray , puede hacer lo siguiente:

 NSMutableDictionary *combinedDictionary = [[NSMutableDictionary alloc] init]; for (NSDictionary *currentDictionary in dictArray) { NSArray *keys = [currentDictionary allKeys]; for (int n=0;n<[keys count];n++) { NSMutableDictionary *dictionaryToAdd = [combinedDictionary valueForKey:[keys objectAtIndex:n]]; if (!dictionaryToAdd) dictionaryToAdd = [[NSMutableDictionary alloc] init]; [dictionaryToAdd setValuesForKeysWithDictionary:[currentDictionary valueForKey:[keys objectAtIndex:n]]]; [combinedDictionary setValue:dictionaryToAdd forKey:[keys objectAtIndex:n]]; } } 

Este código crea primero un dictionary combinedDictionary que será su dictionary final. Recorre todos los dictionarys en su matriz y para cada uno hace lo siguiente:

Primero, obtiene una matriz de todas las keys en el dictionary. Para los dictionarys que proporcionó, este set se verá como @[@"Bath"] para los primeros 3 y @[@"Birmingam"] para los otros dos.

El código luego pasa por estas teclas y obtiene el dictionary ya existente del dictionary combinado de esta key. Si el dictionary no existe, se crea uno.

Luego, agrega todos los valores del dictionary de la matriz y establece que el nuevo dictionary sea el del dictionary combinedDictionary .