字典数组和字符串的过滤器数组

Posted

技术标签:

【中文标题】字典数组和字符串的过滤器数组【英文标题】:Filter Array of Array of Dictionary and string 【发布时间】:2015-04-16 07:24:55 【问题描述】:

我有一个包含字典和字符串数组的数组 我想用字典值过滤, 但是当我进行过滤时,只有当我在文本字段中输入第一个字母时我才会得到结果,我已经为 nspredicate 搜索编写了这段代码 我还附上了 NSarry 的屏幕截图,其中包含我用于过滤的值。

这里是搜索数组的代码:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text


    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSLog(@"%@",searchStr);
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@ ",searchStr];
    NSArray *filteredArr = [arrmainData filteredArrayUsingPredicate:predicate];
    detailListArray=[[NSMutableArray alloc]initWithArray:filteredArr];
    [tblGlosary reloadData];

    return true;

这是数组的截图

【问题讨论】:

【参考方案1】:

您有一个混合类型数组(NSStringNSDictionary),这通常是一个非常糟糕的主意(在 Swift 中是不可能的)。

如果您由于某种原因无法控制它并且确实需要过滤它,您需要根据类型检查您的比较是否正确:

NSIndexSet *matches = [arrmainData indexesOfObjectsPassingTest:BOOL^(id obj, NSUInteger idx, BOOL *stop) 
    NSString *stringToCompare = nil;

    if ([obj isKindOfClass:[NSString class]]) 
        stringToCompare = (NSString *)obj;
     else 
        NSDictionary *dict = (NSDictionary *)obj;
        stringToCompare = dict["Name"];
    

    return [stringToCompare rangeOfString:searchString].location != NSNotFound;
 ];

 NSArray *filteredArray = [arrmainData objectsAtIndexes:matches];

但同样,如果可以的话,真的要重新考虑在同一个数组中混合类型,这很可能会导致未来出现问题。

【讨论】:

以上是关于字典数组和字符串的过滤器数组的主要内容,如果未能解决你的问题,请参考以下文章

swift 3通过字典中键的字符串值过滤字典数组

使用 NSPredicate 过滤包含字典的数组数组

基于单独数组中的对象过滤 NSDictionaries 数组

iOS用数组过滤数组

使用 NSPredicate 过滤数组的 NSDictionary

NSPredicate 根据本地化字符串条目过滤数组