NSPredicate 多级响应

NSPredicate on multilevel response

我的回复是这样的;

{

Writers : [

{

    "name": "Mad Decent Block Party NYC", 
    "artist": [
        {
            "artist_name": "Dillon Francis", 
            "name": "Dillon Francis", 
            "Books" : ["Book1", "Book2", "Book3"]
        }, 
        {
            "artist_name": "Major Lazer", 
            "name": "Major Lazer", 
            "Books" : ["Book4", "Book5", "Book6"]
        }, 
        {
            "artist_name": "Flosstradamus ", 
            "name": "Flosstradamus",
            "Books" : ["Book7", "Book8", "Book9"] 
        }
    ],  
},{

    "name": "Kaskade Atmosphere Tour NYC", 
    "artist": [
        {
            "artist_name": "Ryan Raddon", 
            "name": "Kaskade", 
            "Books" : ["Book1", "Book2", "Book3"]
        }
    ], 
},
]

}

我想在艺术家数组的每个字典上搜索 Books 数组。当文本匹配时,结果应该是 writers 数组中的全部字典对象以及匹配的书籍对象。

例如我搜索的是 Book1,结果应该如下所示,

Writers : [

{

    "artist": [
        {
            "artist_name": "Dillon Francis", 
            "name": "Dillon Francis", 
            "Books" : ["Book1", "Book2", "Book3"]
        }, 
    ],  
    "name": "Mad Decent Block Party NYC", 
},{

    "artist": [
        {
            "artist_name": "Ryan Raddon", 
            "name": "Kaskade", 
            "Books" : ["Book1", "Book2", "Book3"]
        }
    ], 
    "name": "Kaskade Atmosphere Tour NYC", 
},
]
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"ANY artist.Books CONTAINS[cd] %@", @"Book1"];

NSArray *temp = [[sampleDic objectForKey:@"Writers"] filteredArrayUsingPredicate:predicate];

这是我的第一个想法,但看看你的字典结构,我认为这对你不起作用。但是如果你想重新创建你的结构:

@{
  @"Writers":
      @[
          @{
              @"name"     :@"name1",
              @"artist"   :@[ @"Books":[...] ]
              },
          @{
              @"name"     :@"name2",
              @"artist"   :@[ @"Books":[...] ]
              },
          @{
              @"name"     :@"name3",
              @"artist"   :@[ @"Books":[...] ]
              }
          ]
  };

会的。


这不是最好的解决方案,但我认为这对你有用..

示例输入:

 NSDictionary *sampleDic = @{
                            @"Writers":
                                @[
                                    @{
                                        @"name"     :@"Mad Decent Block Party NYC",
                                        @"artist"   :@[
                                                        @{
                                                          @"artist_name":@"Dillon Francis",
                                                          @"name": @"Dillon Francis",
                                                          @"Books" : @[@"Book1", @"Book2", @"Book3"]
                                                        },
                                                        @{
                                                            @"artist_name":@"Major Lazer",
                                                            @"name": @"Major Lazer",
                                                            @"Books" : @[@"Book4", @"Book5", @"Book6"]
                                                        },
                                                        @{
                                                            @"artist_name":@"Flosstradamus",
                                                            @"name": @"Flosstradamus",
                                                            @"Books" : @[@"Book7", @"Book8", @"Book9"]
                                                        }
                                                    ]
                                      },
                                    @{
                                        @"name"     :@"Kaskade Atmosphere Tour NYC",
                                        @"artist"   :@[
                                                            @{
                                                                @"artist_name":@"Ryan Raddon",
                                                                @"name": @"Kaskade",
                                                                @"Books" : @[@"Book1", @"Book2", @"Book3"]
                                                             }
                                                     ]
                                     }
                                ]
                            };

和过滤:

- (NSDictionary *)filterDictionary:(NSDictionary *)sampleDic withBookName:(NSString *)bookName
{
    NSMutableArray *compiledArr = [[NSMutableArray alloc] init];

    for (NSDictionary *itemDic in [sampleDic objectForKey:@"Writers"])
    {
        NSArray *itemDicKeys = [itemDic allKeys];

        for (int i = 0; i < itemDicKeys.count; i++)
        {
            if ([itemDicKeys[i] isEqual:@"artist"])
            {
                NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF['Books'] CONTAINS[cd] %@", bookName];

                NSArray *tempResult = [[itemDic objectForKey:itemDicKeys[i]] filteredArrayUsingPredicate:predicate];

                NSDictionary *result = @{@"name": [itemDic objectForKey:@"name"],
                                         @"artist": tempResult};

                [compiledArr addObject:result];
            }
        }
    }

    NSDictionary *resultDic = @{@"Writer":compiledArr};

    return resultDic;
}

像这样使用它:NSLog(@"tempResult :%@", [self filterDictionary:sampleDic withBookName:@"Book1"]);

结果是:

你只需要为此写两行代码。您形成一个谓词,并使用该谓词过滤 writers 数组。

您可以在谓词中使用键路径,并检查书数组是否包含给定的书名。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY artist.Books contains[cd] 'Book1'"];
NSArray *arr = [responseDict[@"Writers"] filteredArrayUsingPredicate:predicate];

这应该有效。