给定一个 NSDictionary 对象数组如何获取所有键?
Given an array of NSDictionary object how to get all the keys?
如果您有一个字典数组,我该如何创建一个新数组,其中包含数组中每个字典的所有键?
NSArray *array = @[@{@"key1" : @"value 1"},
@{@"key2" : @"value 2"},
@{@"key3" : @"value 3"} ];
// how to achieve this?
NSArray *allKeys = @{@"key1", @"key2", @"key3"};
如果您知道数组中的每个元素都是一个 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];
请使用这段代码,我认为它对你有帮助
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);
虽然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
是所有字典。如果您可以进一步注释集合,那么我建议您这样做。
如果您有一个字典数组,我该如何创建一个新数组,其中包含数组中每个字典的所有键?
NSArray *array = @[@{@"key1" : @"value 1"},
@{@"key2" : @"value 2"},
@{@"key3" : @"value 3"} ];
// how to achieve this?
NSArray *allKeys = @{@"key1", @"key2", @"key3"};
如果您知道数组中的每个元素都是一个 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];
请使用这段代码,我认为它对你有帮助
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);
虽然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
是所有字典。如果您可以进一步注释集合,那么我建议您这样做。