2015-10-14 61 views
1

我的迴應是這樣的;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 : [ 

{ 

    "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", 
}, 
] 

回答

2

你只需要編寫此兩行代碼。你形成一個謂詞,並用謂詞過濾作家數組。

您可以在謂詞中使用關鍵路徑,並檢查書籍數組是否包含給定書名。

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

這應該起作用。

+0

這很適合使用固定文本,如Book1。但是當我用搜索欄嘗試時,我得到了異常。 例外:不能做一個字符串操作的東西,是不是字符串(LHS =( 兄弟, 生日 )RHS = B) – krishna

+0

BTW,即時通訊使用BEGINSWITH,而不是包含的內容。如果我使用CONTAINS,當我輸入包括區分大小寫比較的「Book1」等完整文本時,它會顯示結果。 – krishna

2
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"]);

結果是:

enter image description here