使用 NSPredicate 过滤 NSDictionary 中的值和 return 键数组

Using NSPredicate to filter a value in NSDictionary and return the keys array

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