Поиск NSArray объектов NSDictionary
У меня есть массив контактов, где каждый контакт является словарем.
Каждый контакт имеет ключ "contact_type", который является NSNumber. Тип контакта в основном представляет собой ли его связь Facebook, LinkedIn или Mail и т.д.
У меня есть массив поиска, который содержит только NSNumber of contact_type.
Я хочу создать временный массив контактов, которые я хочу искать, используя мой массив поиска.
Я столкнулся с проблемой использования NSPredicate для создания найденного массива контактов. Может ли кто-нибудь мне посоветовать, как это сделать?
Ответы
Ответ 1
NSArray *contacts = ...; //your array of NSDictionary objects
NSPredicate *filter = [NSPredicate predicateWithFormat:@"contact_type = 42"];
NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter];
После этого filteredContacts
будет содержать только контакты, у которых contact_type
есть 42
.
Если вам нужно искать более одного типа contact_type
, тогда просто используйте OR
в предикате:
filter = [NSPredicate predicateWithFormat:@"contact_type = 42 OR contact_type = 23"];
Ответ 2
Это решение работает для меня.
//Формат NSDictionary
{
18=(
{
content="Great Avijit",
id=abc
}
),
13=(
{
content="Qaru is cool",
id=abc
}
),
}
//Шаг 1
-(void)filterContentForSearchText:(NSString *)searchText
{
[self.filterResultArray removeAllObjects];
NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"(content contains[cd] %@)", searchText];//from_user.name
//other
for (NSMutableDictionary *key in self.messageAll) {
NSArray *array=[self.messageAll objectForKey:key];
array=[array filteredArrayUsingPredicate:namePredicate];
if ([array count]==0) {
[self.filterResultArray removeObject:key];
}
else{
if ([self.filterResultArray containsObject:key]) {
}
else{
[self.filterResultArray addObject:key];
}
}
}
//Reload table view
[self.tableView reloadData];
}
//Шаг 2: numberOfRowsInSection
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (self.searchController.active && ![self.searchController.searchBar.text isEqualToString:@""]) {
return [self.filterResultArray count];
}else{
return [keyArray count];//keyArray hold all key of original dict
}
}
//Шаг 3: В методе cellForRowAtIndexPath
NSString *key = [self.filterResultArray objectAtIndex:indexPath.row];
NSDictionary *dictionary = [[self.messageAll objectForKey:key] lastObject];//self.messageAll is original dict
Ответ 3
Ответ Дэйва выше - это прекрасно, я просто добавляю сюда то, что узнал, проведя 3 часа своего ночного сна.
Когда вы пытаетесь найти строковые значения в словаре массива, вам нужно использовать предикат примерно так:
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"Title CONTAINS[cd] '%@' OR Description CONTAINS[cd] '%@'", searchText, searchText]];
Не забывайте обматывать свои ценности с помощью '', это было единственное, что стоило мне все время. Вот моя последняя функция поиска
-(void)searchTerm : (NSString*)searchText {
if (searchText!=nil && searchText.length) {
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"Title CONTAINS[cd] '%@' OR Description CONTAINS[cd] '%@'", searchText, searchText]];
self.reasonDetailArray = [self.unfilteredReasonDetailArray filteredArrayUsingPredicate:filter];
}else{
self.reasonDetailArray = self.unfilteredReasonDetailArray;
}
[self.tableView reloadData];
}