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

标签 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];

所以在上面的例子中,我需要找到(返回)包含“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/

相关文章:

ios - 如果我更改文档和数据下的 iCloud 开关,应用程序将停止调试。继续在手机上运行

ios - 检查 UIButton 在 Swift 中是否已经存在

iphone - 在 Objective C 中解析二维数组

iphone - 旋转 iPhone/iPad 时正确分配间距?

iphone - rightbarbuttonitem 没有显示?

ios - 应用程序在 IAP 后崩溃 - 仅在 podfiles 更新后

将应用程序提交到 AppStore 时 Xcode 意外退出

xcode - swift 2.2 : GCC_PREPROCESSOR_DEFINITIONS constants no longer imported

ios - 分析 CAKeyframeAnimation 时出现警告

iphone - [UINavigationController setGoalName :]: unrecognized selector sent to instance 0x7964e2c0