Using NSPredicate to filter array of arrays

16,185

Solution 1

Just for completeness: It can be done using 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);

Output:

(
    (
        D,
        E,
        F
    )
)

Solution 2

From what I know you can't do it as a one-liner so instead of using predicateWithFormat: you should use predicateWithBlock:

Something like this should do what you want

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 proved me wrong :)

Share:
16,185
DanielR
Author by

DanielR

Updated on June 04, 2022

Comments

  • DanielR
    DanielR almost 2 years

    I have the following situation:

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

    Now I need a predicate that returns the array that contains a specific string. e.g. Filter Array that contains string9 -> I should get back the entire second array because I need to process the other strings inside that array. Any ideas?

  • Anupdas
    Anupdas almost 11 years
    +1, I was working on this with SUBQUERY, [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $content, $content == [c] %@)",string] but this didn't work. Any pointers?
  • Martin R
    Martin R almost 11 years
    @Anupdas: You were almost there, @"SUBQUERY(SELF, $content, $content == [c] %@).@count > 0" works.
  • Anupdas
    Anupdas almost 11 years
    @MartinR Awesome, it works. So the result of the subquery should be equated to some for even forming the predicate. Thanks :)
  • Martin R
    Martin R almost 11 years
    @Anupdas: Exactly, the SUBQUERY returns a set, but the predicate must evaluate to true or false.
  • Meghs Dhameliya
    Meghs Dhameliya about 9 years
    is it possible to get only E as element of nested array