2016-01-18 104 views
0

我正在嘗試編寫一個函數,用於在字典中搜索字符串,如果找到,則保留條目,否則從數據源中刪除條目。在swift中過濾字典

這是我的初始數據源的結構

[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"] 
    ] 
] 

下面是我的函數看起來像,這裏ltrToCompare是我的搜索字符串,

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 
    } 

上述代碼適用於我的數據結構爲[String: Array<String>]代替[String: Array<Dictionary<String, AnyObject>>]

任何幫助,非常感謝。

+0

您的示例數據與[String:Array >]之間的關係如何? – user3441734

+0

@ user3441734它的結構相同。 – Rao

+0

hm ...不是'完全',請參閱我的回答 – user3441734

回答

2
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]]]