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
函数的集合视图。 我想获取该字符串,然后使用与我之前的viewController
的itemName
字符串相等的字符串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
包含filterItemName
的itemName
,可以执行以下操作:
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