Reputation: 7152
I am trying to write a function which searches for a string in the dictionary and if found, keeps the entry, otherwise removes the entry from data source.
This is my initial data source's structure
[String: Array<Dictionary<String, AnyObject>>]
Example data source:
[
A: [
[id: 1, name: "Android"],
[id: 22, name: "Apple"],
[id: 3, name: "Apricot"]
],
B: [
[id: 33, name: "Bat"],
[id: 45, name: "Breeze"]
]
]
Below is what my function looks like, here ltrToCompare
is my search string,
func getFilteredData(data : [String: Array<Dictionary<String, AnyObject>>], ltrToCompare : String) -> [String: Array<Dictionary<String, AnyObject>>] {
// For keeping the filtered result
var filteredData = [String: Array<Dictionary<String, AnyObject>>]()
// Looping through parent array
for (letter, arr) in data {
// Filters the internal array, below code works when arr is an array containing strings ie., [String], doesn't work for Array<Dictionary<String, AnyObject>>
let filter = arr.filter() {
return $0.lowercaseString.rangeOfString(ltrToCompare.lowercaseString) != nil
}
// Checks whether the inner array filtering returns any element
if (filter.count != 0) {
filteredData.append((letter, filter));
}
}
return filteredData
}
The above code works if my data structure is [String: Array<String>]
instead of [String: Array<Dictionary<String, AnyObject>>]
Any help is greatly appreciated.
Upvotes: 0
Views: 1826
Reputation: 17534
import Foundation
let data:[String: Array<Dictionary<String, AnyObject>>] = [
"A": [
["id": 1, "name": "Android"],
["id": 22, "name": "Apple"],
["id": 3, "name": "Apricot"]
],
"B": [
["id": 33, "name": "Bat"],
["id": 45, "name": "Breeze"]
]
]
func getFilteredData(data : [String: Array<Dictionary<String, AnyObject>>], ltrToCompare : String) -> [String: Array<Dictionary<String, AnyObject>>] {
var filteredData = [String: Array<Dictionary<String, AnyObject>>]()
for (letter, arr) in data {
let filter = arr.filter() {
return $0["name"]?.lowercaseString.rangeOfString(ltrToCompare.lowercaseString) != nil
}
if (filter.count != 0) {
filteredData[letter] = filter
}
}
return filteredData
}
let res = getFilteredData(data, ltrToCompare: "Andro")
print(res) // ["A": [["id": 1, "name": Android]]]
let res2 = getFilteredData(data, ltrToCompare: "aP")
print(res2) // ["A": [["id": 22, "name": Apple], ["id": 3, "name": Apricot]]]
Upvotes: 2