2013-05-15 14 views
15

Tôi đang sử dụng một NSDictionary rằng bản thân có chứa các từ điển một số phím và định dạng values.The của nó là như thế,Filtering NSDictionary với vị

{ 

"1" = { 
     "key1" = "ss", 
      "key2" = "rr", 
      "name" = "nm" 
    }, 
"2" = { 
      "key1" = "tt", 
      "key2" = "vv", 
      "name" = "gf" 
    }, 
"3" = { 
      "key1" = "nm", 
      "key2" = "vv", 
      "name" = "gf" 
    }, 
"4" = { 
      "key1" = "tt", 
      "key2" = "vv", 
      "name" = "gf" 
    }, 
} 

tôi cần phải lọc với các trường hợp đó key1 nên "tt" và khóa2 nên "vv" bằng cách sử dụng NSPredicate.

Trả lời

24

Giả sử rằng

mainDict = { 

"1" = { 
     "key1" = "ss", 
      "key2" = "rr", 
      "name" = "nm" 
    }, 
"2" = { 
      "key1" = "tt", 
      "key2" = "vv", 
      "name" = "gf" 
    }, 
"3" = { 
      "key1" = "nm", 
      "key2" = "vv", 
      "name" = "gf" 
    }, 
"4" = { 
      "key1" = "tt", 
      "key2" = "vv", 
      "name" = "gf" 
    }, 
} 

Bây giờ bạn có thể lọc theo cách sau:

NSArray *resultArray = [[mainDict allValues] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(key1 == %@) AND (key2==%@)", @"tt",@"vv"]]; 

thử này để kiểm tra:

NSMutableDictionary *mainDict=[[NSMutableDictionary alloc] init]; 
for(int i=1; i<=3; i++) 
{ 
    [mainDict setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"tt",@"key1",@"vv",@"key2",@"ttqwdwd",@"name", nil] forKey:[NSString stringWithFormat:@"%i",i]]; 
} 
[mainDict setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"tt",@"key1",@"kk",@"key2",@"ttwwdwd",@"name", nil] forKey:[NSString stringWithFormat:@"%i",4]]; 
[mainDict setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"tt",@"key1",@"kk",@"key2",@"ttwwdwd",@"name", nil] forKey:[NSString stringWithFormat:@"%i",5]]; 
NSArray *resultArray = [[mainDict allValues] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(key1 == %@) AND (key2==%@)", @"tt",@"vv"]]; 
NSLog(@"%@",resultArray); 
2
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys: 
        [NSArray arrayWithObjects:@"a", @"b", @"c", nil], @"a", 
        [NSArray arrayWithObjects:@"b", @"c", @"a", nil], @"b", 
        [NSArray arrayWithObjects:@"c", @"a", @"b", nil], @"c", 
        [NSArray arrayWithObjects:@"a", @"b", @"c", nil], @"d", 
        nil]; 
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@[SELF][0] == 'a'", d]; 
NSLog(@"%@", p); 
NSArray *keys = [d allKeys]; 
NSArray *filteredKeys = [keys filteredArrayUsingPredicate:p]; 
NSLog(@"%@", filteredKeys); 
NSDictionary *matchingDictionary = [d dictionaryWithValuesForKeys:filteredKeys]; 
NSLog(@"%@", matchingDictionary); 

hãy thử điều này thực sự hữu ích cho bạn.

+0

Chỉ hoạt động nếu phím là chuỗi. – akashivskyy

6

thử như thế này it'l works.you có thể thiết lập các giá trị riêng của mình tại đây

NSArray *data = [NSArray arrayWithObjects:[NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"ss",@"how", nil] forKeys:[NSArray arrayWithObjects:@"key1",@"key1", nil]],[NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"tt",@"vv", nil] forKeys:[NSArray arrayWithObjects:@"key1",@"key2", nil]],[NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"vv",@"tt", nil] forKeys:[NSArray arrayWithObjects:@"key1",@"key2", nil]],nil];  
NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(key1 == %@) AND (key2==%@)", @"tt",@"vv"]]; 
NSLog(@"%@",filtered); 

O/P: -

(
     { 
     key1 = tt; 
     key2 = vv; 
    } 
) 

Chỉnh sửa: - Rõ ràng cho Explation

NSMutableDictionary *dict4=[[NSMutableDictionary alloc]init]; 
    [dict4 setObject:@"ss" forKey:@"key1"]; 
    [dict4 setObject:@"how" forKey:@"key2"]; 
    NSMutableDictionary *dict5=[[NSMutableDictionary alloc]init]; 
    [dict5 setObject:@"tt" forKey:@"key1"]; 
    [dict5 setObject:@"vv" forKey:@"key2"]; 
    NSMutableDictionary *dict6=[[NSMutableDictionary alloc]init]; 
    [dict6 setObject:@"vv" forKey:@"key1"]; 
    [dict6 setObject:@"tt" forKey:@"key2"]; 

    NSMutableArray *data = [[NSMutableArray alloc]init]; 
    [data addObject:dict4]; 
    [data addObject:dict5]; 
    [data addObject:dict6]; 

    NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(key1 == %@) AND (key2==%@)", @"tt",@"vv"]]; 
    NSLog(@"%@",filtered); 

O/P: -

(
     { 
     key1 = tt; 
     key2 = vv; 
    } 
) 
+0

@Nassif: khi kiểm tra câu trả lời đã chỉnh sửa của tôi, nó sẽ giúp bạn. – Balu

+0

Kiểm tra câu trả lời tại đây: http://stackoverflow.com/questions/4901774/nspredicate-on-nsdictionary – Meet

1

Bạn có thể sử dụng phương pháp keysOfEntriesPassingTestNSDictionary.

Ví dụ:

NSSet *keys = [dict keysOfEntriesPassingTest:^BOOL(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { 
NSDictionary *object =(obj); 
return ([@"tt" isEqualToString:object[@"key1] &&[@"vv"isEqualToString:object[@"key2"]); 
}]; 

tham khảo: Apple Doc