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