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

时间:2016-11-13 04:53:42

标签: ios arrays swift dictionary filter

我有一个这样的课程

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

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尝试不同的事情来完成同样的任务。

4 个答案:

答案 0 :(得分:15)

我希望我明白你在问什么。你提到了一系列词典"但是你实际上在你发布的代码中的任何地方都没有一系列词典。

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

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

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 }

答案 1 :(得分:3)

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

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

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

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

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

OR

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

答案 2 :(得分:0)

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

concat

答案 3 :(得分:0)

在这里,我使用CoreData,并且有Dictionary数组。 在这里,我过滤值是发票数组的键paymentToInvoice,然后过滤包含人词典的键invoiceToPeople,然后搜索包含搜索文本的名字,姓氏,组织多个键。 希望对您有所帮助。请尝试“谢谢”

  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
  }