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];
这应该有效。
我的回复是这样的;
{
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];
这应该有效。