使用NSPredicate过滤NSDictionary中的值并返回键数组



我有一个字符串值和一个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];

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

假设您有一个字典数组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

以下代码根据对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];

最新更新