2013-06-21 2 views
8

У меня следующая ситуация:Использование NSPredicate для фильтрации массива массивов

NSArray(
    NSArray(
     string1, 
     string2, 
     string3, 
     string4, 
     string5, 
    ) 
    , 
    NSArray(
     string6, 
     string7, 
     string8, 
     string9, 
     string10, 
    ) 
) 

Теперь мне нужен предикат, который возвращает массив, который содержит определенную строку. , например. Массив фильтра, который содержит string9 -> Мне нужно вернуть весь второй массив, потому что мне нужно обработать другие строки внутри этого массива. Есть идеи?

+0

есть смотреть на него и не отвечать, если полезно или любые вопросы [Здесь] (http://stackoverflow.com/questions/4559427/using-nspredicate-in -2d-массивы) – the1pawan

ответ

19

Просто для полноты: Это может быть сделано с помощью predicateWithFormat::

NSArray *array = @[ 
    @[@"A", @"B", @"C"], 
    @[@"D", @"E", @"F"], 
]; 

NSString *searchTerm = @"E"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF == %@", searchTerm]; 
NSArray *filtered = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@", filtered); 

Выход:

 
(
    (
     D, 
     E, 
     F 
    ) 
) 
+0

+1, я работал над этим с SUBQUERY, '[NSPredicate predicateWithFormat: @" SUBQUERY (SELF, $ content, $ content == [c]% @) ", string]', но это didn ' т работы. Любые указатели? – Anupdas

+0

спасибо, это отличное решение. – DanielR

+1

@Anupdas: Вы были почти там, '@ SUBQUERY (SELF, $ content, $ content == [c]% @). @ Count> 0" 'работает. –

1

Из того, что я знаю, что вы не можете сделать это в качестве однострочника поэтому вместо того, чтобы использовать predicateWithFormat: вы должны использовать predicateWithBlock:

Что-то вроде этого должны делать то, что вы хотите

NSString *someString = @"Find me"; // The string you need to find. 
NSArray *arrayWithArrayOfStrings = @[]; // Your array 
[arrayWithArrayOfStrings filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSArray *evaluatedArray, NSDictionary *bindings) { 
    return [evaluatedArray indexOfObject:someString] != NSNotFound; 
}]]; 

Update: Martin R доказал меня неправильно :)