【问题标题】:Searching NSArray of NSDictionary objects搜索 NSDictionary 对象的 NSArray
【发布时间】:2011-08-16 07:39:50
【问题描述】:

我有一个联系人数组,其中每个联系人都是一个字典。

每个联系人都有一个键“contact_type”,它是一个 NSNumber。联系人类型基本上代表它是 Facebook、LinkedIn 还是邮件联系人等。 我有一个仅包含 NSNumber 的contact_type 的搜索数组。

我想要的是制作一个临时的联系人数组,我想使用我的搜索数组进行搜索。

我在使用 NSPredicate 创建搜索联系人数组时遇到了麻烦。有人可以指导我如何操作吗?

【问题讨论】:

    标签: ios nsarray nsdictionary nspredicate


    【解决方案1】:
    NSArray *contacts = ...; //your array of NSDictionary objects
    NSPredicate *filter = [NSPredicate predicateWithFormat:@"contact_type = 42"];
    
    NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter];
    

    此后,filteredContacts 将只包含contact_type42 的联系人。

    如果您需要搜索不止一种contact_type,那么只需在谓词中使用OR

    filter = [NSPredicate predicateWithFormat:@"contact_type = 42 OR contact_type = 23"];
    

    【讨论】:

    • 您好,感谢您的回复。但我正在寻找不止一种联系人类型的搜索......我找到了解决方案。
    • 再次感谢。我发布了与您的类似的解决方案,但我正在寻找更精确的解决方案。
    • 但是我的解决方案失败了......,从你的解决方案中,我有一个 42,43 的数组......我想搜索而不是像你提到的那样单独搜索
    • @Satyam svv:(基于您现在删除的答案)contact_type 返回一个标量值,而标量值不能“包含”任何东西。但是,如果您将 CONTAINS 更改为 IN那么它应该可以工作。
    • 当使用 NSNumber 与数组进行比较时,它不起作用。对于字符串它的工作。以下代码不起作用 NSPredicate* predicate = [NSPredicate predicateWithFormat:@"type IN %@",postMediumIDs]; self.contactsArray = (NSMutableArray*)[self.contactsArray filteredArrayUsingPredicate:predicate];
    【解决方案2】:

    这个解决方案对我来说很酷。

    //NSDictionary 格式

    {
     18=(
         {
            content="Great Avijit",
            id=abc
         }
     ),
    13=(
         {
            content="Stack Overflow is cool",
            id=abc
          }
     ),
    } 
    

    //第一步

     -(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];
    
      }
    

    //第二步: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
        }
    
    }
    

    //第三步:在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];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-08
        • 2017-01-31
        • 2012-05-17
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多