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

Posted

技术标签:

【中文标题】使用 NSPredicate 过滤 NSDictionary 中的值并返回键数组【英文标题】:Using NSPredicate to filter a value in NSDictionary and return the keys array 【发布时间】: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];

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

【问题讨论】:

【参考方案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];

【讨论】:

以上是关于使用 NSPredicate 过滤 NSDictionary 中的值并返回键数组的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate的使用

使用 NSPredicate 过滤文件路径

使用 NSPredicate 过滤 - 数据类型?

如何使用 NSPredicate 过滤 NSArray

使用 NSPredicate 根据 NSDictionary 键过滤 NSArray

使用 NSPredicate 过滤数组