给定一个NSDictionary对象的数组如何获取所有键?

时间:2016-04-20 15:35:19

标签: ios objective-c nsarray nsdictionary

如果您有一个字典数组,如何创建一个新数组,其中包含数组中每个字典的所有键?

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

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

3 个答案:

答案 0 :(得分:2)

如果您知道数组中的每个元素都是NSDictionary,则可以对数组中的每个项调用allKeys方法。我已经为此示例添加了类型检查,以防您的数组包含其他非NSDictionary的对象:

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);

日志:

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

如果您需要一个不可变NSArray而不是NSMutableArray

NSArray *allKeysImmutable = [allKeys copy];

答案 1 :(得分:1)

使用此代码,我认为它可以帮助您

 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 :(得分:1)

虽然Objective-C缺少阵列展平方法,但您可以简化外部步骤:

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

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

return [result copy];

或者,如果您需要重复数据删除密钥:

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

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

return [result allObjects];

... array是所有字典的唯一类型假设(仅略微宽松)。如果你可以进一步注释这些集合,那么我建议你这样做。