Reputation: 6587
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
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
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