2014-07-01 91 views
0

另一个NSArray的,我想用NSPredicate过滤器使用NSPredicate

NSArray *a = @[@{@"key1": @"foo", @"key2": @(53), @"key3": @(YES)}, 
       @{@"key1": @"bar", @"key2": @(12), @"key3": @(YES)}, 
       @{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 

NSArray *b = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 

NSArray *expectedResult = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 

我想是这样来筛选与另一NSArrayNSArray一个的NSArray:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"key1 like (key1 IN %@)", b]; 
NSArray *result = [a filteredArrayUsingPredicate:predicate]; 

但不幸的是,我没有让它起作用。

回答

2

使用这个简单的查询。要获得数组bkey1的值,您必须使用简单的KVCvalueForKey:方法。

NSArray *a = @[@{@"key1": @"foo", @"key2": @(53), @"key3": @(YES)}, 
       @{@"key1": @"bar", @"key2": @(12), @"key3": @(YES)}, 
       @{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 

NSArray *b = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 

NSArray *expectedResult = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"key1 IN %@",[b valueForKey:@"key1"]]; 
NSArray *result = [a filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@",result); 
+0

非常感谢 – klefevre

1

你可以做NSSet

下面这个由申请路口为例

NSArray *a = @[@{@"key1": @"foo", @"key2": @(53), @"key3": @(YES)}, 
       @{@"key1": @"bar", @"key2": @(12), @"key3": @(YES)}, 
       @{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 

NSArray *b = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 
NSMutableSet *aIntersection = [NSMutableSet setWithArray:a]; 
[aIntersection intersectSet:[NSSet setWithArray:b]]; 
NSArray *expectedResult = [aIntersection allObjects]; 
+0

该答案并不令人满意,因为这种过滤器不能通过独特的密钥测试工作。如果'key2'等于“@(94)'而不是'@(42)',例如它不起作用...您可以使用方法' - [NSMutableArray removeObjectsInArray:]'而不是使用'NSSet'实现你写的东西。 – klefevre

0

您可以通过NSPredicate类的方法做到这一点+ predicateWithBlock:

NSArray *a = @[@{@"key1": @"foo", @"key2": @(53), @"key3": @(YES)}, 
        @{@"key1": @"bar", @"key2": @(12), @"key3": @(YES)}, 
        @{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 
NSArray *b = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}]; 
NSArray *filteredArray = [a filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     return [b containsObject:evaluatedObject]; 
    }]];