web-dev-qa-db-fra.com

swift 3 tableau de filtres de dictionnaires par valeur de chaîne de clé dans le dictionnaire

J'ai un cours comme celui-ci

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

}

et je le mentionne sur mon 

class MapViewVC: UIViewController, MKMapViewDelegate {

var found = [FoundItem]()

var filterItemName : String()

}

Mes FoundItem sont générés par dans un tableau de dictionnaires de ma classe de FoundItem à partir d'une requête firebase. J'obtiens ensuite une chaîne de cette itemName générée à partir d'un autre contrôleur de vue qui est une vue de collection de la fonction didSelection. Je veux prendre cette chaîne et ensuite filtrer ou rechercher les tableaux avec la chaîne itemName qui est égale à la chaîne itemName de ma précédente viewController. Puis supprimé le tableau de dictionnaires qui ne sont pas égaux à la itemName. Pas seulement les objets, mais tout le tableau qui contient une paire clé/valeur non égale. J'ai cherché pendant des jours et je suis bloqué pour filtrer un ensemble de dictionnaires créés à partir d'une classe. J'ai regardé et essayé NSPredicates, des boucles for-in, mais tout ce qui finit par se produire est de créer un nouveau tableau ou un bool qui trouve que mes valeurs ou mes clés sont égales. Voici la fonction actuelle que j'ai écrite. 

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

Quelqu'un peut-il aider? Il semble que ce serait une tâche simple de trouver la valeur, puis de filtrer les dictionnaires qui ne sont pas égaux à la chaîne itemName, mais je continue de frapper un mur. Et me heurter moi-même à des boucles: P essayer différentes choses pour accomplir la même tâche. 

5
Cory Billeaud

Trier le tableau du dictionnaire de la manière suivante

var dict:[[String:AnyObject]] = sortedArray.filter{($0["parentId"] as! String) == "compareId"}

La fonction filter effectue une boucle sur chaque élément d'une collection et renvoie une collection contenant uniquement des éléments satisfaisant une condition d'inclusion.

Nous pouvons obtenir un seul objet à partir de ce tableau de dictionnaire, vous pouvez utiliser le code suivant 

var dict = sortedArray.filter{($0["parentId"] as! String) == "compareId"}.first

OR

 let dict = sortedArray.filter{ ($0["parentId"] as! String) == "compareId" }.first
3
IKKA

Ici, j’utilise CoreData et j’ai un tableau de dictionnaire . Ici, je filtre la clé paymentToInvoice dont la valeur est tableau de facturation, puis key factureToPeople qui contient le dictionnaire de personnes, puis je recherche les prénoms, nom, organisation, clé multiple contenant searchText . J'espère que ça aide S'il vous plaît essayez ceci Merci

  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

Filtre de recherche local utilisant le prédicat dans un tableau d'objets de dictionnaire avec le nom de clé, ce code est également utilisé pour Swift3 et 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()
    }


  }
0