Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSPredicate on array of arrays

I have an array, that when printed out looks like this:

(
        (
        databaseVersion,
        13
    ),
        (
        lockedSetId,
        100
    )
)

Would it be possible to filter this using an NSPredicate (potentially by the index in the array). So something like: give me all rows where element 0 is 'databaseVersion'? I know that if I had an array of dictionaries I could do this with a predicate similar the one found here, but I found that when using dictionaries and storing a large amount of data, my memory consumption went up (from ~80mb to ~120mb), so if possible I would to keep the array. Any suggestions on how this might be done?

like image 825
Kyle Avatar asked Dec 12 '22 20:12

Kyle


2 Answers

This can be done using "SELF[index]" in the predicate:

NSArray *array = @[
    @[@"databaseVersion", @13],
    @[@"lockedSetId", @100],
    @[@"databaseVersion", @55],
    @[@"foo", @"bar"]
];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[0] == %@", @"databaseVersion"];
NSArray *filtered = [array filteredArrayUsingPredicate:pred];
NSLog(@"%@", filtered);

Output:

(
        (
        databaseVersion,
        13
    ),
        (
        databaseVersion,
        55
    )
)

Or you can use a block-based predicate:

NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(NSArray *elem, NSDictionary *bindings) {
    return [elem[0] isEqualTo:@"databaseVersion"];
}];
like image 82
Martin R Avatar answered Jan 15 '23 02:01

Martin R


Simply you can use ANY in NSPredicate:

it's works fine

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF == %@", @"value"];

or

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF contains[cd] %@", @"value"];
like image 36
Vvk Avatar answered Jan 15 '23 01:01

Vvk