在未知的NSDictionary / NSArray深度中搜索对象

时间:2012-01-29 19:46:37

标签: iphone ios xcode nsarray nsdictionary

我已经问了一个类似的问题,但这有点不同所以我认为可以提出另一个问题。

我在数组中存储数组,以及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 - 我在返回字典时遇到了麻烦,并且还在比较对象。

希望我的问题很明确。谢谢你尽你所能的帮助。

1 个答案:

答案 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];

但是,你必须小心递归。如果存在任何循环路径,您将获得无限循环(并且在崩溃之前堆栈溢出)。