【问题标题】:NSPredicate 'OR' filtering based on an NSArray of keys基于 NSArray 键的 NSPredicate 'OR' 过滤
【发布时间】:2012-06-22 08:13:51
【问题描述】:

考虑以下 NSArray:

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

我能够过滤这个数组以找到包含 key key1

的字典对象
// Filter our dataSet to only contain dictionary objects with a key of 'key1'
NSString *key = @"key1";
NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN self.@allKeys", key];
NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate];
NSLog(@"filteretSet1: %@",filteretSet1);

适当的返回:

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

现在,我想过滤包含 NSArray 中键的 ANY 的字典对象的数据集。

例如,使用数组:NSArray *keySet = [NSArray arrayWithObjects:@"key1", @"key3", nil]; 我想创建一个谓词,它返回包含“key1”“key3”的any字典对象数组'(即在本例中,除了第三个对象之外的所有字典对象都将返回 - 因为它不包含 'key1' 'key3')。

关于我将如何实现这一目标的任何想法?我必须使用复合谓词吗?

【问题讨论】:

    标签: objective-c nsarray nspredicate foundation


    【解决方案1】:

    虽然问题已得到解答,但您也可以使用块来获得更多粒度:

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

    这可以根据需要重新排列,也许在它自己的方法中。

    【讨论】:

      【解决方案2】:

      NSPredicateANY 运算符涵盖了这一点:

      NSSet *keys = [NSSet setWithObjects:@"key1", @"key3", nil];
      
      NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"any self.@allKeys in %@", keys];
      

      【讨论】:

      • any 是我所缺少的。我不知道为什么我发现 NSPredicate 如此难以理解。感谢您的回答。单声道 +1 :)
      • 区分大小写吗?我最终会发现,但我希望它已经是。稍后再评论。
      • @coolcool1994 上述谓词中的 ANY 和 IN(和 SELF)不区分大小写(实际上我经常将它们全部大写以使其突出),键/方法名称是,所以@allKeys区分大小写。
      • 好的,所以这不区分大小写。谢谢!
      【解决方案3】:

      这样做:

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

      非常适合我。希望有帮助

      【讨论】:

      • 感谢您的意见。我知道能够使用 OR。我想使用数组的原因是用于任意数量的键,而不是恰好 2 个键。
      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多