2010-03-16 5 views
2

У меня есть NSArray объектов NSDictionary, которые я хотел бы получить, чтобы вернуть новый массив NSDictionaries, где каждый NSDictionary имеет «Area == North» (например) ,Отфильтровать все NSDictionaries из NSArray на основе нескольких ключей

Ближайший пример, который я нашел до сих пор, это Using NSPredicate to filter an NSArray based on NSDictionary keys, но это просто возвращает уникальные значения для данного ключа, а не словарь, который имеет эту клавишу. Есть ли способ выполнить аналогичную операцию и вернуть весь словарь?

ответ

2

Звучит довольно просто:

NSArray *unfilteredDictionaries; // however you get this... 
NSMutableArray *filteredDictionaries = 
    [NSMutableArray arrayWithCapacity:[unfilteredDictionaries count]]; 
NSDictionary *dict; 
for (dict in unfilteredDictionaries) 
    if ([[dict valueForKey:@"Area"] isEqualToString:@"North"]) 
    [filteredDictionaries addObject:dict]; 

return filteredDictionaries; 
9

NSPredicate должен работать нормально, я попытался это:

NSMutableArray *a = [NSMutableArray array]; 
[a addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"North", @"Area", @"North", @"Test", nil]]; 
[a addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"South", @"Area", @"North", @"Test", nil]]; 
[a addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"East", @"Area", @"North", @"Test", nil]]; 
NSPredicate *p = [NSPredicate predicateWithFormat:@"%K matches %@", @"Area", @"North"]; 
NSArray *newArray = [a filteredArrayUsingPredicate:p]; 
NSLog(@"newArray:%@", [newArray description]); 

Он работает.

Смежные вопросы