簡體   English   中英

搜索未知NSDictionary / NSArray深度的對象

[英]Searching for an object in an unknown NSDictionary/NSArray depth

我已經問過一個類似的問題,但這有點不同,所以我認為最好再問一個問題。

我將數組以及NSDictionaries存儲在數組中。 它是一種實用程序,沒有設置結構,用戶可以根據需要輸入嵌套信息。

我需要一個方法,該方法可以滾動瀏覽Array / Dictionary的全部內容,並根據我發送的值返回特定的字典。 這是一個例子。

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”的字典。

我問的類似問題位於此處。 在未知的NSMutableArray深度中搜索值 -我在返回字典以及比較對象時遇到麻煩。

希望我的問題很清楚。 謝謝你的盡心幫助。

答案繼續,您需要做一些修改:

- (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];

但是,您必須小心遞歸。 如果有任何循環路徑,您將得到一個無限循環(崩潰前堆棧溢出)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM