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

我有一个这样的课

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

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

我希望我理解你的要求。 你提到了一个“字典数组”,但你实际上在你发布的代码中没有任何字典数组。

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

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

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

而已。


其他一些想法:

如果要搜索itemName包含filterItemNameitemName ,可以执行以下操作:

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

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

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

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

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

 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