NSPredicate使用nsstring过滤完整的NSArray字符串

时间:2015-11-20 04:29:50

标签: ios objective-c nsdictionary nspredicate

我需要过滤一个多嵌套的json,它基本上是一个包含key值的字典数组,也是数组

这是一个示例

{//Upper structure, an nsaaray of responses
Items =     (
            {
        descriptionRating = "some";
        category = 20;
    }
);
 dynamicVales =     (
    {
        text = "name";
        value = "falafel";
        type = 3;
    },
    {
        text = "name";
        value =       (
           turkeysandwich, 
           burger, 
           snickers
        );
        type = 2;
    },
    {
    text = "name";
        value = "whatever";
        type = 2;
    },

  );
},

所以我有一个响应的nsarray,每个响应在这种情况下都有一个nsarray的nsarray称为“dynamicVales”,这可以包含一个字符串或一个字符串数组,我需要过滤所有的响应,其中dynamicVales中的值为=一个字符串我有一个值。该字符串等于数组

 NSString *selectedString = @"turkeysandwich, burger, snickers";

我试过这个

[filteredresponses = self.responses filteredArrayUsingPredicate:[NSString 
 stringWithFormat:@"dynamicVales.value CONTAINS '%@'", selectedString];

显然这不起作用,有没有办法在一个谓词中执行此操作,而不是循环遍历这些内部数组?

   value =       (
           turkeysandwich, 
           burger, 
           snickers
        );

总而言之,我需要过滤掉字符串的全部内容,使其与Value中的NSArray的所有内容相等。

2 个答案:

答案 0 :(得分:4)

对于您的问题,请尝试以下代码。

NSString *predicateString = [NSString stringWithFormat:@"ANY dynamicVales.value == 'chicken'"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
NSArray *filteredResults = [Mainarray filteredArrayUsingPredicate:predicate];

你可以看到Predicate the arrays或Dictionaries的更多语法,你可以从下面的链接中学到很多东西:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-SW1

快乐的编码!

答案 1 :(得分:0)

您可以使用predicateWithBlock方法创建谓词。在块内,检查dynamicVale是否包含要搜索的值。

代码:

NSArray *yourArray = ....;
NSString *searchText = ...;

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSDictionary   * _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
    NSArray *dynamicVales = [evaluatedObject valueForKeyPath: @"dynamicVales.value"];
    return [dynamicVales containsObject:searchText];

}];

NSArray *filteredArray = [yourArray filteredArrayUsingPredicate:predicate];