我有一个这样的课程
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尝试不同的事情来完成同样的任务。
答案 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
}