我已经问了一个类似的问题,但这有点不同所以我认为可以提出另一个问题。
我在数组中存储数组,以及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];
所以在上面的例子中,我需要找到(返回)包含“我是id”的字典。
我问过的类似问题就在这里.. Searching for a value in an unknown NSMutableArray depth - 我在返回字典时遇到了麻烦,并且还在比较对象。
希望我的问题很明确。谢谢你尽你所能的帮助。
答案 0 :(得分:4)
继续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];
但是,你必须小心递归。如果存在任何循环路径,您将获得无限循环(并且在崩溃之前堆栈溢出)。