Ich habe eine Klasse wie diese
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
}
und ich verweise es auf meine
class MapViewVC: UIViewController, MKMapViewDelegate {
var found = [FoundItem]()
var filterItemName : String()
}
Meine FoundItem
werden durch ein Array von Wörterbüchern aus meiner Klasse FoundItem
aus einer Firebase-Abfrage generiert. Ich erhalte dann eine Zeichenfolge von diesem itemName
, die von einem anderen Ansichtscontroller generiert wird, der eine Sammlungsansicht für die didSelection
-Funktion ist. Ich möchte diesen String nehmen und dann die Arrays mit dem String itemName
filtern oder durchsuchen, der dem itemName
-String meines vorherigen viewController
entspricht. Dann wurde das Array von Wörterbüchern entfernt, die nicht mit itemName
übereinstimmen. Nicht nur die Objekte, sondern das gesamte Array, das ein ungleiches Schlüsselpaar enthält. Ich habe nach Tagen gesucht, und ich bin fest damit beschäftigt, ein Array von Wörterbüchern zu filtern, die aus einer Klasse erstellt wurden. Ich habe mir NSPredicates-for-in-Schleifen angesehen und ausprobiert, aber am Ende wird nur ein neues Array oder ein neues Bool erstellt, in dem festgestellt wird, dass meine Werte oder Schlüssel gleich sind. Hier ist die aktuelle Funktion, die ich geschrieben habe.
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")
}
}
Kann jemand helfen? Es scheint so, als wäre es die einfache Aufgabe, den Wert herauszufinden und dann die Wörterbücher herauszufiltern, die nicht mit der Zeichenfolge itemName
identisch sind. Und selbst in For-in-Loops laufen: P verschiedene Dinge ausprobieren, um dieselbe Aufgabe zu erfüllen.
Ich hoffe, ich habe verstanden, was Sie gefragt haben. Sie erwähnen ein "Array von Wörterbüchern", haben jedoch nirgendwo im Code, den Sie gepostet haben, ein Array von Wörterbüchern.
Soweit ich das beurteilen kann, fragen Sie, wie Sie alle Einträge im Array found
finden, für die itemName
der Eigenschaft filterItemName
entspricht.
Wenn ja, müssen Sie nur Folgendes tun:
let foundItems = found.filter { $0.itemName == filterItemName }
Das ist es.
Einige andere Ideen:
Wenn Sie nach Elementen suchen möchten, in denen filterItemName
in itemName
enthalten ist, können Sie Folgendes tun:
let foundItems = found.filter { $0.itemName.contains(filterItemName) }
Sie können auch die Funktion lowercased()
verwenden, wenn Sie die Suche ohne Berücksichtigung der Groß-/Kleinschreibung durchführen möchten.
Sie können auch die Eigenschaften Ihrer gefundenen Elemente in ein Array zurückgeben:
let foundIds = found.filter { $0.itemName == filterItemName }.map { $0.itemId }
Sortieren Sie das Wörterbuch auf folgende Weise
var dict:[[String:AnyObject]] = sortedArray.filter{($0["parentId"] as! String) == "compareId"}
Die Funktion filter durchläuft jedes Element in einer Auflistung und gibt eine Auflistung zurück, die nur Elemente enthält, die eine Include-Bedingung erfüllen.
Wir können ein einzelnes Objekt aus diesem Array von Wörterbüchern erhalten. Sie können den folgenden Code verwenden
var dict = sortedArray.filter{($0["parentId"] as! String) == "compareId"}.first
OR
let dict = sortedArray.filter{ ($0["parentId"] as! String) == "compareId" }.first
Hier verwende ich CoreData Und ich habe Array of Dictionary .. Hier filtern ich den Schlüssel paymentToInvoice, dass der Wert Rechnung Array ist, dann key RechnungToPeople, dass der Schlüssel People Dictionary enthält. Ich hoffe, es hilft. Bitte versuchen Sie es. Danke
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
}
Lokaler Suchfilter mit Prädikat in Array von Wörterbuchobjekten Mit dem Schlüsselnamen wird dieser Code sowohl für Swift3 als auch für Swift4,4.1 verwendet.
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()
}
}