swift 3 matrice de filtre de dictionnaires par la chaîne de valeur de la clé dans le dictionnaire
J'ai une classe comme cela
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 j'en référence sur mon
class MapViewVC: UIViewController, MKMapViewDelegate {
var found = [FoundItem]()
var filterItemName : String()
}
Mon FoundItem
sont générés par dans un tableau de dictionnaires de ma classe de FoundItem
à partir d'un firebase requête. Je puis obtenir une chaîne de itemName
qui est généré à partir d'un autre point de vue sur un contrôleur de la vue d'une collection sur le didSelection
fonction. Je veux profiter de cette chaîne, puis filtrer ou rechercher les tableaux avec la chaîne itemName
qui est de l'égalité de l' itemName
chaîne de mon précédent viewController
. Ensuite enlevé le tableau de dictionnaires qui ne sont pas égales à la itemName
. Non seulement les objets, mais l'ensemble du tableau qui contient la non-égalité de clé, valeur paire. J'ai cherché pendant des jours, et je suis coincé sur le filtrage d'un tableau de dictionnaires créés à partir d'une classe. J'ai regardé et essayé NSPredicates, pour-dans les boucles, mais tout ce qui arrive est la création d'un nouveau tableau ou bool qui trouve mes valeurs ou les clés sont égaux. Voici la fonction 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")
}
}
Peut aider quelqu'un? Il me semble qu'il serait de la simple tâche de trouver la valeur, puis filtrer les dictionnaires ne sont pas égaux à la itemName
chaîne, mais je continue de frapper un mur. Et en cours d'exécution dans les boucles for-in moi-même 😛 essayé différentes choses pour réaliser la même tâche.
OriginalL'auteur Cory Billeaud | 2016-11-13
Vous devez vous connecter pour publier un commentaire.
J'espère que j'ai compris ce que vous demandez. Vous évoquez un "tableau de dictionnaires" mais vous n'avez pas réellement une gamme de dictionnaires n'importe où dans le code que vous avez posté.
Aussi loin que je peux dire, vous vous demandez comment trouver toutes les entrées dans la
found
tableau pour lequelitemName
est égale à lafilterItemName
propriété.Si donc, tout ce que vous devez faire est de:
let foundItems = found.filter { $0.itemName == filterItemName }
.
Quelques autres idées:
Si vous souhaitez rechercher pour les articles pour lesquels
filterItemName
est contenue dans leitemName
, vous pourriez faire quelque chose comme ceci:let foundItems = found.filter { $0.itemName.contains(filterItemName) }
Vous pouvez également faire usage de la
lowercased()
fonction de si vous voulez faire de la casse de la recherche.Vous pouvez également revenir propriétés de vos éléments trouvés dans un tableau:
let foundIds = found.filter { $0.itemName == filterItemName }.map { $0.itemId }
J'ai hésité parce que je vais poster cette app dans l'app store, j'ai changé les noms de mes variables de classe avec ma fonction de variables. J'ai travaillé sur cette application depuis plus d'un mois maintenant par moi-même. Et je suis l'espoir d'obtenir quelques revenus publicitaires et, éventuellement, de le vendre comme je l'ai récemment perdu mon emploi. Merci encore
Oui le laisser foundItems = trouvés.filtre { $0.nom de l'élément.contient(filterItemName) }, était exactement la solution que je cherchais, ne peux pas croire que j'ai passé autant de temps sur quelque chose de si simple. J'aurais juste posté cette question de jours.
Un bon morceau de conseils de programmation est si vous êtes coincé sur quelque chose de plus qu'un jour pour demander de l'aide. Parfois, en parlant des choses suffit, parfois, d'autres personnes vous voient comme je l'ai fait, vous avez juste allé dans le mauvais chemin entièrement. Il arrive à tout le monde parfois. Bonne chance avec votre projet.
OriginalL'auteur par
Trie un tableau de dictionnaire à l'aide de la manière suivante
Le filtre fonction boucle sur chaque élément dans une collection, et retourne une collection contenant uniquement les éléments qui satisfont un inclure condition.
Nous pouvons obtenir seul objet à partir de cette matrice de dictionnaire , vous pouvez utiliser le code suivant
OU
OriginalL'auteur IKKA
De recherche locale filtre à l'aide de prédicat dans la gamme de dictionnaire des objets
avec le nom de la clé de ce code à utiliser pour les swift3 et swift4,4.1 également.
OriginalL'auteur GangiReddy Rami Reddy
J'utilise ici CoreData Et j'ai Éventail de Dictionnaire .
Ici, je suis filtre de la clé paymentToInvoice de la valeur de la facture de tableau puis sur la touche invoiceToPeople qui touche des Personnes de Dictionnaire alors je recherche FirstName, lastName, de l'Organisation des multiples contiennent texterecherché.
J'espère que ça aide s'il vous Plaît essayer ce Merci
OriginalL'auteur Yogesh Patel