4

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?

2 Answers 2

7

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"];
}];
Sign up to request clarification or add additional context in comments.

2 Comments

Ah very nice. That does exactly what i'm looking for. Just curious where you came up with the SELF[index] value. I'm not seeing that anywhere in the documentation?
@Zenox it's defined in the BNF for predicate format strings: developer.apple.com/library/mac/documentation/cocoa/conceptual/…
6

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.