我已经问过一个类似的问题,但这个问题略有不同,所以我想再问一个问题就好了。
我在数组中存储数组,以及 NSDictionaries。它是一种实用型应用程序,没有固定的结构,用户可以根据需要输入嵌套信息。
我需要一种方法,它可以滚动浏览数组/字典的全部内容,并根据我发送给该方法的值返回特定的字典。这是一个例子..
NSMutableArray *array = [[NSMutableArray alloc]init];
NSMutableDictionary *enteredItem = [[NSMutableDictionary alloc]init];
[enteredItem setObject:@"i'm a title" forKey:@"title"];
[enteredItem setObject:@"i'm an id" forKey:@"id"];
[enteredItem setObject:@"i'm a description" forKey:@"description"];
[enteredItem setObject:@"i'm a timestamp" forKey:@"timestamp"];
[enteredItem setObject:array forKey:@"items"];
[array addObject:enteredItem];
[array addObject:anotherDictionary];
[array addObject:moreDictionaries];
所以在上面的例子中,我需要找到(返回)包含“i'm an id”的字典。
我问的类似问题位于此处.. Searching for a value in an unknown NSMutableArray depth - 我在返回字典和比较对象时遇到问题。
希望我的问题很清楚。谢谢你尽你所能的帮助。
最佳答案
继续 the answer ,你需要做一些修改:
- (id)findDictionaryWithValue:(id)value inArray:(NSArray *)array
{
__block id match = nil;
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[NSArray class])
{
match = [self findDictionaryWithValue:value inArray:obj];
}
else if ([obj isKindOfClass:[NSDictionary class])
{
match = [self findDictionaryWithValue:value inDictionary:obj];
}
*stop = (match!=nil);
}];
return match;
}
- (id)findDictionaryWithValue:(id)value inDictionary:(NSDictionary *)dict;
{
__block id match = nil;
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if([obj isEqual:value]) {
match = dict;
}
else if ([obj isKindOfClass:[NSArray class])
{
match = [self findDictionaryWithValue:value inArray:obj];
}
else if ([obj isKindOfClass:[NSDictionary class])
{
match = [self findDictionaryWithValue:value inDictionary:obj];
}
*stop = (match!=nil);
}];
return match;
}
NSDictionary *resultDict = [self findDictionaryForValue:@"i'm an id" inArray:array];
但是,您必须小心递归。如果有任何循环路径,你将得到一个无限循环(并且在崩溃前堆栈溢出)。
关于iphone - 在未知的 NSDictionary/NSArray 深度中搜索对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056186/