wake-up-neo.com

swift 3 filtert ein Array von Wörterbüchern nach dem Wert des Schlüssels im Wörterbuch

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. 

5
Cory Billeaud

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 }

13
par

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
3
IKKA

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
  }
0
Yogesh Patel

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()
    }


  }