同时过滤具有2个条件的数组?

Posted

技术标签:

【中文标题】同时过滤具有2个条件的数组?【英文标题】:Filter an Array with 2 conditions at the same time? 【发布时间】:2018-08-24 09:17:52 【问题描述】:

我有一个User 模型,它从数据库中下载所有用户,将它们存储在users 数组中并在UITableView 中显示它们。在UITableView 上方,我有一个UISearchBar 以允许用户过滤它们。

搜索有效,但用户有一个usernames_lowercase 和一个displayName,我希望能够过滤users 数组,对于usernames_lowercasedisplayName,将其存储在@987654331 @array 然后重新加载/显示结果。我无法弄清楚如何做到这一点......如果它甚至可以用这样的单个数组来做到这一点。

StartNewMessage: UITableViewDelegate, UITableViewDataSource 

    var users = [UserModel]()
    var searchUsers = [UserModel]()
    var searching = false

    func numberOfSections(in tableView: UITableView) -> Int 
         return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        if searching 
            return searchUsers.count
        
        else 
            return users.count
        
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "UsersChatTVCell") as! UsersChatTVCell
        if searching 
            let searchUser = searchUsers[indexPath.row]
            cell.user = searchUser
        
        else 
            let user = users[indexPath.row]
            cell.user = user
        
         return cell
    


extension StartNewMessage: UISearchBarDelegate 

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
        let trimmedSearchWord = searchText.trimmingCharacters(in: CharacterSet.punctuationCharacters)
        searchUsers = users.filter( $0.username_lowercase!.prefix(searchText.count) == trimmedSearchWord.lowercased())
        searchUsers = users.filter( $0.displayName!.prefix(searchText.count) == searchText) // doesn't work, basically rewrites the data
        print(searchText.lowercased())
        searching = true
        tableView.reloadData()
    

【问题讨论】:

【参考方案1】:

使用|| (OR) 运算符指定多个条件。

searchUsers = users.filter 
    $0.username_lowercase!.prefix(searchText.count) == trimmedSearchWord.lowercased()
    || $0.displayName!.prefix(searchText.count) == searchText

【讨论】:

好吧,我确实尝试过,但不知何故我搞砸了语法,可能是因为它不适合我。但是,是的,它工作得很好!谢谢(再次!:))【参考方案2】:

创建另一个用户模型副本并使用 searchText,如下所示:

// self.Copied_User_Model -> 复制的用户模型

// User_Model -> 原始用户模型

self.Copied_User_Model = []
            for item in self.Copied_User_Model 
                if item.user_name.localizedCaseInsensitiveContains(searchText) != false  item.display_Name.localizedCaseInsensitiveContains(searchText) != false
                    self.Copied_User_Model.append(item)
                 else 

                
            

            self.tableview.reloadData()
            if searchText == "" 
                self.Copied_User_Model = self.User_MOdel
                self.tableview.reloadData()
            

希望对您有所帮助。 谢谢。

【讨论】:

以上是关于同时过滤具有2个条件的数组?的主要内容,如果未能解决你的问题,请参考以下文章

我需要从 PIG HADOOP 的同一列中过滤 2 个条件

javascript 过滤具有多个条件的对象数组。

过滤具有相同 ID 和给定条件的对象的 json 数组

C语言如何实现满足多条件匹配简单过滤问题

如何过滤具有多个条件的托管对象实体

如何按条件过滤数组