swift 3通过字典中键的字符串值过滤字典数组

Posted

技术标签:

【中文标题】swift 3通过字典中键的字符串值过滤字典数组【英文标题】:swift 3 filter array of dictionaries by string value of key in dictionary 【发布时间】:2017-03-27 00:37:39 【问题描述】:

我有这样的课程

class FoundItem : NSObject 

var id : String!
var itemName : String!
var itemId : Int!
var foundBy : String!
var timeFound : String!

init(id: String,
    itemName: String,
    itemId: Int,
    foundBy: String,
    timeFound: String)


    self.id = id
    self.itemName = itemName
    self.itemId = itemId
    self.foundBy = foundBy
    self.timeFound = timeFound


我在我的

上引用了它
class MapViewVC: UIViewController, MKMapViewDelegate 

var found = [FoundItem]()

var filterItemName : String()


我的FoundItem 是通过firebase 查询生成的我的FoundItem 类中的字典数组。然后我得到一个itemName 的字符串,它是从另一个视图控制器生成的,它是didSelection 函数的集合视图。我想获取该字符串,然后使用字符串itemName 过滤或搜索数组,该字符串与我之前的viewController 中的itemName 字符串相等。然后删除不等于itemName 的字典数组。不仅仅是对象,而是包含不相等键值对的整个数组。我已经找了好几天了,我一直在过滤从一个类创建的字典数组。我已经查看并尝试了 NSPredicates、for-in 循环,但最终发生的只是创建一个新的数组或布尔值,它发现我的值或键是相等的。这是我编写的当前函数。

func filterArrayBySearch() 

    if self.filterItemName != nil 

        dump(found)

        let namePredicate = NSPredicate(format: "itemName like %@", "\(filterItemName)")
        let nameFilter = found.filter  namePredicate.evaluate(with: $0) 

        var crossRefNames = [String: [FoundItem]]()
        for nameItemArr in found 
            let listName = nameItem.itemName
            let key = listName

            if crossRefNames.index(forKey: key!) != nil 

                crossRefNames[key!]?.append(nameItemArr)

                if !("\(key)" == "\(filterItemName!)") 

                    print("------------- Success have found [[[[[[    \(key!)    ]]]]]] and \(filterItemName!) to be equal!!")

                     // crossRefNames[key!]?.append(nameItemArr)

                 else 

                    print("!! Could not find if \(key!) and \(filterItemName!) are equal !!")
                


             else 

                crossRefNames[key!] = [nameItemArr]
            
        

     else 

        print("No Data from Search/FilterVC Controller")
    

有人可以帮忙吗?似乎找到该值然后过滤掉不等于itemName 字符串的字典是一项简单的任务,但我一直碰壁。我自己也遇到了 for-in 循环:P 尝试不同的事情来完成相同的任务。

【问题讨论】:

【参考方案1】:

在这里我使用 CoreData 并且我有 Dictionary 数组。 在这里,我过滤键值是发票数组的键 paymentToInvoice,然后键值 invoiceToPeople,键包含人员字典,然后我搜索 FirstName、lastName、Organization 多个键包含 searchText。 希望对你有帮助 请试试这个 谢谢

  var searchDict = dict.filter  (arg0) -> Bool in

       let (key, value) = arg0
       for paymentInfo in (value as! [PaymentInfo])
            let organization = (Array((value as! [PaymentInfo])[0].paymentToInvoice!)[0] as! InvoiceInfo).invoiceToPeople?.organization
            let firstName = (Array((value as! [PaymentInfo])[0].paymentToInvoice!)[0] as! InvoiceInfo).invoiceToPeople?.firstName
            let lastName = (Array((value as! [PaymentInfo])[0].paymentToInvoice!)[0] as! InvoiceInfo).invoiceToPeople?.lastName
            return organization?.localizedStandardRange(of: searchText) != nil || firstName?.localizedStandardRange(of: searchText) != nil || lastName?.localizedStandardRange(of: searchText) != nil
       
       return true
  

【讨论】:

【参考方案2】:

在字典对象数组中使用谓词的本地搜索过滤器 带有键名,此代码也用于 swift3 和 swift4,4.1。

  func updateSearchResults(for searchController: 
       UISearchController) 

   if (searchController.searchBar.text?.characters.count)! > 0 
       guard let searchText = searchController.searchBar.text, 
       searchText != "" else 
           return
       
       usersDataFromResponse.removeAll()
       let searchPredicate = NSPredicate(format: "userName 
        CONTAINS[C] %@", searchText)

       usersDataFromResponse = (filteredArray as 
        NSArray).filtered(using: searchPredicate)

       print ("array = \(usersDataFromResponse)")

       self.listTableView.reloadData()
    


  

【讨论】:

【参考方案3】:

使用以下方式对字典数组进行排序

var dict:[[String:AnyObject]] = sortedArray.filter($0["parentId"] as! String) == "compareId"

filter 函数循环遍历集合中的每个项目,并返回一个仅包含满足包含条件的项目的集合。

我们可以从这个字典数组中获取单个对象,你可以使用下面的代码

var dict = sortedArray.filter($0["parentId"] as! String) == "compareId".first

 let dict = sortedArray.filter ($0["parentId"] as! String) == "compareId" .first

【讨论】:

【参考方案4】:

我希望我明白你在问什么。您提到了“字典数组”,但实际上在您发布的代码中的任何地方都没有字典数组。

据我所知,您问的是如何在itemName 等于filterItemName 属性的found 数组中查找所有条目。

如果是这样,您需要做的就是:

let foundItems = found.filter $0.itemName == filterItemName

就是这样。


其他一些想法:

如果您想搜索filterItemName 包含在itemName 中的项目,您可以执行以下操作:

let foundItems = found.filter $0.itemName.contains(filterItemName)

如果您想进行不区分大小写的搜索,也可以使用lowercased() 函数。

您还可以将找到的元素的属性返回到数组中:

let foundIds = found.filter $0.itemName == filterItemName .map $0.itemId

【讨论】:

天哪,这就是我所缺少的。我在 let foundItems = found.filter 0$.itemName == "(filterItemName)" 之前写过,我得到了所有的数组,而不仅仅是等于 filterItemName 的数组。地图不是必需的,因为我需要整个数组稍后在项目中进行注释。我认为这完全是我所需要的。该死。我花了几天时间来做一个简单的逻辑陈述。现在我只需将该数组附加到使用我的注释 circleQuery 的数组中,我想我已经解决了。我会去检查它,看看它是否正是我需要的......谢谢。 我犹豫了,因为我要在应用商店发布这个应用程序,我更改了我的类变量的名称以及我的函数变量。我一个人在这个应用程序上工作了一个多月。我希望获得一些广告收入,并可能在我最近失业时将其出售。再次感谢 是的 let foundItems = found.filter $0.itemName.contains(filterItemName) 是我正在寻找的确切解决方案,不敢相信我花了这么多时间在这么简单的事情上。我应该在几天前发布这个问题。 一个很好的编程建议是,如果您在某件事上卡住超过一天,请寻求帮助。有时说出来就足够了,有时其他人会像我一样看到你完全走错了路。 每个人都会遇到这种情况。祝你的项目好运。

以上是关于swift 3通过字典中键的字符串值过滤字典数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 None 值删除字典中键的正确方法

如何使用 Swift 将具有两个不同键的两个值存储到数组或字典中? [关闭]

从数组值中过滤字典

如何在Python中更改嵌套字典中键的值[关闭]

使用谓词的字典过滤器数组 - swift3

如何更新嵌套字典中键的值?