Filtering NSDictionary with predicate

前端 未结 4 1736
一生所求
一生所求 2020-12-13 15:31

I am using a NSDictionary that itself contains dictionaries some keys and its values.The format is like ,

{

\"1\" = {
        \"key1\" = \"ss\",
          \         


        
相关标签:
4条回答
  • 2020-12-13 16:07
    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);
    

    try this really helpful to you.

    0 讨论(0)
  • 2020-12-13 16:08

    You can use keysOfEntriesPassingTest method of NSDictionary.

    Eg.

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

    Reference : Apple Doc

    0 讨论(0)
  • 2020-12-13 16:14

    Assume that

    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"
         },
    }
    

    Now you can filter by the following way:

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

    try this to check:

    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);
    
    0 讨论(0)
  • 2020-12-13 16:28

    This works. You can set your own values here.

    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);
    

    Output:

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

    For clearer explanation:

    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);
    

    Output:

    (
        {
            key1 = tt;
            key2 = vv;
        }
    )
    
    0 讨论(0)
提交回复
热议问题