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