NSPredicate,在NSArray中搜索NSArray的NSArray

时间:2014-05-06 15:36:15

标签: objective-c nspredicate

我有NSArray NSDictionary

NSDictionary的其中一个键包含NSArray个字符串。

有没有办法可以使用NSPredicate在字符串数组中查找特定的strins?

谢谢:)

另外:这项工作很棒,但不适用于sublevelArray

predicate = [NSPredicate predicateWithFormat:@" %K LIKE[cd] %@", sKey, sLookForString];

3 个答案:

答案 0 :(得分:1)

在NSArray上你可以使用filteredArrayUsingPredicate:,在NSDictionary上使用enumerateKeysAndObjectsUsingBlock:然后对每个值做一个filteredArrayUsingPredicate:如果是NSArray你可以使用evaluateWithObject:谓词本身。

答案 1 :(得分:1)

只需在格式字符串中将 LIKE 替换为 CONTAINS 即可。例如,给定此数组:

NSArray *dogs = @[@{@"name" : @"Fido",
                    @"toys" : @[@"Ball", @"Kong"]},
                  @{@"name" : @"Rover",
                    @"toys" : @[@"Ball", @"Rope"]},
                  @{@"name" : @"Spot",
                    @"toys" : @[@"Rope", @"Kong"]}];

...可以使用以下谓词获取仅包含字典的过滤数组,其中键玩具的值是包含字符串 Kong 的数组。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS[cd] %@", @"toys", @"Kong"];

答案 2 :(得分:0)

如果要根据字符串数组过滤字典数组,可以使用-predicateWithBlock过滤数组,如下面的代码所示:

- (NSArray *)filterArray:(NSArray *)array WithSearchString:(NSString *)searchString {
    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        NSDictionary *dictionary = (NSDictionary *)evaluatedObject;
        NSArray *strings = [dictionary objectForKey:@"strings"];

        return [strings containsObject:searchString];
    }];

    return [array filteredArrayUsingPredicate:predicate];
}