Поиск объекта на неизвестной глубине NSDictionary / NSArray - PullRequest
0 голосов
/ 29 января 2012

Я уже задавал подобный вопрос, но он немного отличается, поэтому я подумал, что было бы неплохо задать другой вопрос.

Я храню Массивы в Массивах, а также словари NS. Это служебное приложение, и в нем нет заданной структуры, пользователь может вводить вложенную информацию столько, сколько ему требуется.

Мне нужен метод, который может прокручивать все содержимое массива / словаря и возвращать конкретный словарь на основе значения, которое я отправляю методу. Вот пример ..

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

Так что в приведенном выше примере мне нужно будет найти (вернуть) словарь, который содержит «я - идентификатор».

Подобный вопрос, который я задал, находится здесь .. Поиск значения в неизвестной глубине NSMutableArray - У меня проблемы с возвратом словаря и сравнением объекта.

Надеюсь, мой вопрос понятен. Спасибо за любую помощь, которую вы можете предложить.

1 Ответ

4 голосов
/ 30 января 2012

Продолжая с ответа , вам нужно внести некоторые изменения:

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

Однако вы должны быть осторожны с рекурсией.Если есть какой-либо круговой путь, вы получите бесконечный цикл (и переполнение стека перед сбоем).

...