【问题标题】:Using NSPredicate to filter a value in NSDictionary and return the keys array使用 NSPredicate 过滤 NSDictionary 中的值并返回键数组
【发布时间】:2015-09-13 15:49:06
【问题描述】:

我有一个包含字符串值和 int 键的字典。

{1,abc}

{2,bcd}

{3,cde}

我正在使用 NSPredicate 过滤它,如下所示

NSMutableDictionary *tableDataSearch;
    NSArray *searchResults;

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self contains[cd] %@", searchText];

searchResults = [[tableDataSearch allValues] filteredArrayUsingPredicate:resultPredicate];

它返回包含特定单词的值数组。我希望在数组中返回所有键,并像现在搜索一样搜索值。 有什么帮助吗?

【问题讨论】:

    标签: ios objective-c nspredicate


    【解决方案1】:

    假设你有一个字典数组 myArrayOfDict。和字典有不同的键。这将为您提供任何值包含您的字符串的所有字典:

    NSMutableArray* myArrayOfDict = [@[@{@"key1":@"value1"} , @{@"key2": @"value2"}]mutableCopy];
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"ANY SELF.@allValues contains[cd] %@", @"lue1"];
    
    NSArray *searchResults = [myArrayOfDict filteredArrayUsingPredicate:resultPredicate]; // will get the 2nd diction
    

    【讨论】:

    • 这一行给出错误。NSMutableDictionary searchResults = [tableDataSearch filteredArrayUsingPredicate:resultPredicate]; 没有可见界面;我将 tabeDataSearch 初始化为 tableDataSearch = [[NSMutableDictionary alloc] init] ;
    • 该代码适用于 ArrayOfDictionnaries,不适用于字典:[myArrayOfDict filteredArrayUsingPredicate:resultPredicate]; myArrayOfDict 应该是 dict 数组而不是字典。
    【解决方案2】:

    以下代码根据对其值的子字符串搜索过滤NSDictionary

    NSDictionary *data = @{@1 : @"abc",
                           @2 : @"bcd",
                           @3 : @"def"};
    
    NSString *searchText = @"bc";
    
    NSMutableDictionary *filteredData = [NSMutableDictionary new];
    
    [data enumerateKeysAndObjectsUsingBlock:^(id key, NSString *obj, BOOL *stop) {
        NSRange range = [obj rangeOfString:searchText
                                    options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch];
        if (range.location != NSNotFound)
        {
            [filteredData setObject:obj forKey:key];
        }
    }];
    NSArray *keys = [filteredData allKeys];
    

    如果感觉有点麻烦,BlocksKit 为 NSDictionary 提供了一些有用的扩展:

    NSDictionary *filteredData = [data bk_select:^BOOL(id key, NSString *obj) {
        NSRange range = [obj rangeOfString:searchText
                                   options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch];
        return range.location != NSNotFound;
    }];
    

    如果您更喜欢使用NSPredicate,您可以将range.location != NSNotFound 替换为:

    [resultPredicate evaluateWithObject:obj];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多