P.J
P.J

Reputation: 6587

Compare String Array with Dictionary in Swift 3

I have string Array let filterClassName = ["A","B"]

Now I have Dictionary which looks like:

var responseArray: [[String: Any]] = []

responseArray.append(["id": 1,"name": "Prateek", "className": "A"])
responseArray.append(["id": 1,"name": "rateek", "className": "B"])
responseArray.append(["id": 3,"name": "ateek", "className": "C"])
responseArray.append(["id": 4,"name": "teek", "className": "D"])
responseArray.append(["id": 5,"name": "eek", "className": "A"])
responseArray.append(["id": 6,"name": "ek", "className": "E"])

Now from responseArray which is my Dictionary I want all values which matches my className mentioned in filterClassName

So, I should get output as Array of:

["id": 1,"name": "Prateek", "className": "A"],["id": 1,"name": "rateek", "className": "B"],["id": 5,"name": "eek", "className": "A"]

Thanks in advance!

This is what I have tried:

for value in filterClassName {
    let cal = responseArray.filter { (($0["className"] as! String).contains(value)) }
    for value in cal {
        let valuesss = value
        print ("valuesss" + String(describing: valuesss))
    }
}

My above answer is very basic, but I want something like this to work:

let cal = responseArray.filter { (($0["className"] as! String).contains(filterClassName)) }

In short, single line for filtering and no for loops as I hate them!

Upvotes: 0

Views: 1110

Answers (2)

vadian
vadian

Reputation: 285270

You are quite close, but it's the other way round:

let filteredItems = responseArray.filter{ filterClassName.contains($0["className"] as! String) } 

However – as Hamish mentioned in the comments – it's more efficient to use a custom struct.

Your code:

let filterClassName = ["A","B"]

var responseArray: [[String: Any]] = []

responseArray.append(["id": 1,"name": "Prateek", "className": "A"])
responseArray.append(["id": 1,"name": "rateek", "className": "B"])
responseArray.append(["id": 3,"name": "ateek", "className": "C"])
responseArray.append(["id": 4,"name": "teek", "className": "D"])
responseArray.append(["id": 5,"name": "eek", "className": "A"])
responseArray.append(["id": 6,"name": "ek", "className": "E"])

Code to add:

struct Student {
    let name, className : String
    let id : Int

    init?(dictionary: [String:Any]) {
        guard let id = dictionary["id"] as? Int,
            let name = dictionary["name"] as? String,
            let className = dictionary["className"] as? String else { return nil }
        self.id = id
        self.name = name
        self.className = className
    }
}

let students = responseArray.flatMap { Student(dictionary:$0) }
let filteredItems = students.filter{ filterClassName.contains($0.className) }
print(filteredItems)

Upvotes: 2

Subramanian P
Subramanian P

Reputation: 4375

You have to check the filterClassName Array contains the class name.

let filteredResponse = responseArray.filter { filterClassName.contains($0["className"] as! String) }

Upvotes: 2

Related Questions