Nagendra Rao
Nagendra Rao

Reputation: 7152

filtering a dictionary in swift

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

Answers (1)

user3441734
user3441734

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

Related Questions