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 值删除字典中键的正确方法