使用 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 中的值并返回键数组的主要内容,如果未能解决你的问题,请参考以下文章