2016-04-20 7 views
0

Wenn Sie über ein Array von Wörterbüchern verfügen, wie erstelle ich ein neues Array mit allen Schlüsseln, die für jedes Wörterbuch im Array vorhanden sind?Gegeben ein Array von NSDictionary-Objekt, wie Sie alle Schlüssel erhalten?

NSArray *array = @[@{@"key1" : @"value 1"}, 
        @{@"key2" : @"value 2"}, 
        @{@"key3" : @"value 3"} ]; 

// how to achieve this? 
NSArray *allKeys = @{@"key1", @"key2", @"key3"}; 

Antwort

1

plz diesen Code verwenden, halte ich es für Sie

hilft
NSArray *array = @[@{@"key1" : @"value 1"}, 
         @{@"key2" : @"value 2"}, 
         @{@"key3" : @"value 3"} ]; 

    NSMutableArray *key_array=[NSMutableArray array]; 

    for (NSDictionary *dictionary in array) { 

     NSArray *key_dictionary=[dictionary allKeys]; 

     for (NSString *string_key in key_dictionary) { 
      [key_array addObject:string_key]; 
     } 

    } 
    NSLog(@"%@",key_array); 
2

Wenn Sie wissen, dass jedes Element im Array eine NSDictionary ist, können Sie die allKeys Methode für jedes Element im Array nennen. Ich habe eine Art Scheck an diesem Beispiel für den Fall hinzugefügt Array enthält andere Objekte, die nicht NSDictionary sind:

NSArray *array = @[@{@"key1" : @"value 1"}, 
        @{@"key2" : @"value 2"}, 
        @{@"key3" : @"value 3"}]; 

NSMutableArray *allKeys = [@[] mutableCopy]; 

for (id obj in array) { 
    if ([obj isKindOfClass:[NSDictionary class]]) { 
     NSDictionary *dict = obj; 
     [allKeys addObjectsFromArray:[dict allKeys]]; 
    } 
} 

NSLog(@"%@", allKeys); 

Logs:

2016-04-20 11:38:42.096 ObjC-Workspace[10684:728578] (
    key1, 
    key2, 
    key3 
) 

Und wenn Sie eine unveränderliche NSArray anstelle eines NSMutableArray benötigen:

NSArray *allKeysImmutable = [allKeys copy]; 
+1

Wenn Sie wissen, dass alle Elemente im Array Wörterbücher sind, ändern Sie das 'for' nach' for (NSDictionary * dict in array) '. und entfernen Sie die 'isKindOfClass'-Prüfung. – rmaddy

+0

@rmaddy Ja, das hatte ich bei meinem ersten Schnitt aber sicherheitshalber geändert, da SO anfällig für Copy-Paste-Codierer ist. Bearbeitete meine Antwort, um das zu erklären. Vielen Dank. – JAL

+0

Warum eine Kopie eines leeren unveränderlichen Arrays erstellen, anstatt nur ein leeres veränderbares Array direkt zu erstellen? – Sulthan

1

Obwohl Objective-C ein Array-Abflachen Verfahren fehlt, können Sie dennoch die äußere Schritt vereinfachen:

NSMutableArray *result = [[NSMutableArray alloc] init]; 

for(NSArray *keys in [array valueForKey:@"allKeys"]) 
    [result addObjectsFromArray:keys]; 

return [result copy]; 

Oder, wenn Sie Schlüssel benötigen dedupliziert:

NSMutableSet *result = [[NSMutableSet alloc] init]; 

for(NSArray *keys in [array valueForKey:@"allKeys"]) 
    [result unionSet:[NSSet setWithArray:keys]]; 

return [result allObjects]; 

... die Nur Typ Annahme ist (nur etwas lockerer als) dass array alle Wörterbücher sind. Wenn Sie die Sammlungen weiter annotieren können, empfehle ich Ihnen, dies zu tun.

Verwandte Themen