2017-03-22 1 views
0

Ich betreibe derzeit diesen Code:Filter mehrmals auf ein Wörterbuch

searchterm = "test" 
results = resultsArray.filter { $0.description.contains (searchterm!) } 

Meine Frage ist, wie ich in company_name oder place oder einem anderen Feld in meinem Modell suche, und fügen Sie die Ergebnisse.

Muss ich Filter zusammen verwenden und dann die Ergebnisse an eine neue Variableninstanz meines Modells anhängen?

EDIT:

Wenn "Test" ist in company_name, Ort und Beschreibung. Ich möchte alle drei Ergebnisse zurückgeben. Wenn jedoch "test" nur vorhanden ist, brauche ich nur Platz, um zurückgegeben zu werden.

EDIT2:

Dies ist ein Beispiel für mein Modell Rückkehr. Ist das ein Wörterbuch oder ein Array? Es tut mir leid, dass ich nicht zu 100% den Unterschied kenne. Ich weiß, ‚‚this‘: ist‘, was ein Wörterbuch aussieht, aber weil es [waren] Klammern um sie herum, dachte ich, dass es ein Array aus ...

struct GraphData { 

    var description: String 
    var company_name: String 
    var places: String 

    init(description: String, company_name: String, places: String){ 
     self.description = description 
     self.company_name = company_name 
     self.places = places 
    } 

func toAnyObject() -> Any { 
    print("return") 
    return [ 
     "description": description, 
     "company_name": company_name, 
     "places": places, 
    ] 
} 
+0

Sind Sie sicher, dass Sie ein Wörterbuch sind Filterung und kein Array? – Alexander

+0

Wörterbuch, glaube ich .. lol Der Code oben funktioniert gut – Denis

+0

Sie warum haben Sie es 'resultsArray' genannt? – Alexander

Antwort

3

Der einfachste Weg, dies zu tun wäre, eine benutzerdefinierte contains Methode in Ihrem Modell zu schaffen, können Sie den Suchbegriff übereinstimmen gegen jede Eigenschaft im Modell verwenden:

class YourModel { 
    var company_name: String 
    var description: String 
    var place: String 

    // ... 

    func contains(_ searchTerm: String) -> Bool { 
     return self.company_name.contains(searchTerm) 
      || self.description.contains(searchTerm) 
      || self.place.contains(searchTerm) 
    } 
} 

Sie können dann filtern Sie einfach Ihre individuelle Methode:

let searchTerm = "test"  
let results = resultsArray.filter { $0.contains(searchTerm) } 
+0

Ich werde das in einer Sekunde versuchen, es sieht interessant aus. – Denis

+0

Ich habe gerade Ihre Kommentare zu Ihrem ursprünglichen Beitrag gesehen. Können Sie klären, ob 'resultsArray' (A) ein Array von Wörterbüchern oder (B) ein Array von benutzerdefinierten Modellen oder (C) ein Wörterbuch ist? –

+0

Aleks, ich bin mir eigentlich nicht sicher ... Ich benutze ein Modell, aber die Ergebnisse sind in einem Wörterbuch. Bedeutet das seine und das Array eines benutzerdefinierten Modells? – Denis

0

Ist dies ErgebnisseArray ein Wörterbuch oder ein Array?

Sie können

let searchTerm = "test" 
let filter = resultsArray.filter{ $0.company_name!.contains(searchTerm) || $0.place!.contains(searchTerm) } 

bearbeiten etwas tun

class TestClass: NSObject { 

    var place: String? 
    var company_name: String? 

    func contain(searchTerm: String) -> [String] { 

     var result = [String]() 

     if let placeVal = place, placeVal.contains(searchTerm) { 
      result.append(placeVal) 
     } 

     if let companyVal = company_name, companyVal.contains(searchTerm) { 
      result.append(companyVal) 
     } 

     return result 
    } 
} 

let searchTerm = "test" 
let filter = resultsArray.map { $0.contain(searchTerm: searchTerm) } 
+0

Es ist ein Wörterbuch. Wenn in diesem Beispiel "test" sowohl in company_name als auch in place enthalten wäre, würden beide Ergebnisse oder nur die Ergebnisse in company_name zurückgegeben. Ich hatte den Eindruck, dass bei der Verkettung von Filtern die erste wahre Aussage aufhört. – Denis

+0

ja, wenn der $ 0.company_name! .contains (searchTerm) zu true ausgewertet wird, dann ti wird aufhören (weil das eine OR-Bedingung ist) – Keaz

+0

Also dann wird es nicht mein Problem lösen – Denis

Verwandte Themen