2012-06-20 30 views
8

Xem xét NSArray sau:NSPredicate 'OR' lọc dựa trên một NSArray các phím

NSArray *dataSet = [[NSArray alloc] initWithObjects: 
       [NSDictionary dictionaryWithObjectsAndKeys:@"abc", @"key1", @"def", @"key2", @"hij", @"key3", nil], 
       [NSDictionary dictionaryWithObjectsAndKeys:@"klm", @"key1", @"nop", @"key2", nil], 
       [NSDictionary dictionaryWithObjectsAndKeys:@"qrs", @"key2", @"tuv", @"key4", nil], 
       [NSDictionary dictionaryWithObjectsAndKeys:@"wxy", @"key3", nil], 
       nil]; 

Tôi có thể lọc mảng này để tìm đối tượng từ điển có chứa các chínhkey1

// Filter our dataSet to only contain dictionary objects with a key of 'key1' 
NSString *key = @"key1"; 
NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN [email protected]", key]; 
NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate]; 
NSLog(@"filteretSet1: %@",filteretSet1); 

Trả lại một cách thích hợp:

filteretSet1: (
     { 
     key1 = abc; 
     key2 = def; 
     key3 = hij; 
    }, 
     { 
     key1 = klm; 
     key2 = nop; 
    } 
) 

Bây giờ, tôi muốn lọc bộ dữ liệu cho các đối tượng từ điển có chứa ANY của các khóa trong NSArray.

Ví dụ, bằng cách sử dụng mảng: NSArray *keySet = [NSArray arrayWithObjects:@"key1", @"key3", nil]; Tôi muốn tạo ra một vị trả về và mảng của bất kỳ đối tượng từ điển có chứa một trong hai 'key1' hoặc 'key3' (nghĩa là trong ví dụ này tất cả các đối tượng từ điển sẽ. được trả về ngoại trừ đối tượng thứ ba - vì nó không chứa 'key1' hoặc 'key3').

Bất kỳ ý tưởng nào về cách tôi sẽ đạt được điều này? Tôi có phải sử dụng một vị từ ghép không?

Trả lời

9

Các ANY điều hành của NSPredicate diện này:

NSSet *keys = [NSSet setWithObjects:@"key1", @"key3", nil]; 

NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"any [email protected] in %@", keys]; 
+0

* bất kỳ * là những gì tôi đã mất tích. Tôi không biết tại sao tôi thấy NSPredicate rất khó khăn để có được đầu của tôi xung quanh. Cảm ơn câu trả lời của bạn. Monolo +1 :) –

+0

trường hợp này có nhạy cảm không? Tôi sẽ tìm ra cuối cùng, nhưng tôi hy vọng nó đã được. Ill bình luận lại sau. – coolcool1994

+0

@ coolcool1994 BẤT K and và IN (và SELF) trong biến vị ngữ trên không phân biệt chữ hoa chữ thường (trên thực tế, tôi thường viết chúng trong tất cả các chữ cái để làm nổi bật), tên khóa/phương thức, vì vậy '@ allKeys' _is_ case sensitive . – Monolo

1

Làm điều này:

NSString *key = @"key1"; 
    NSString *key1 = @"key3"; 
    NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN [email protected] OR %@ IN [email protected]",key,key1]; 
    NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate]; 
    NSLog(@"filteretSet1: %@",filteretSet1); 

trình hoàn hảo cho tôi. Hy vọng có ích

+0

Cảm ơn bạn đã nhập. Tôi biết có thể sử dụng OR. Lý do tôi muốn sử dụng một mảng là cho bất kỳ số lượng các phím hơn là chính xác 2 phím. –

1

Mặc dù các câu hỏi đã được trả lời, bạn cũng có thể sử dụng khối để biết thêm chi tiết:

NSArray *filter = [NSArray arrayWithObjects:@"key1", @"key3",nil]; 

NSPredicate *filterBlock = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind){   
    NSDictionary *data = (NSDictionary*)obj; 

    // use 'filter' and implement your logic and return YES or NO 
}]; 

[dataSet filteredArrayUsingPredicate:filterBlock]; 

Điều đó có thể được sắp xếp lại như bạn muốn, có thể trong phương pháp riêng của nó.

Các vấn đề liên quan