2015-05-12 55 views
1

我正在尝试从JSON中获取的字典数组中搜索值。我有tableViewControllerUISearchResultsUpdating。我发现了一个例子与字符串数组:在词典数组中搜索

func updateSearchResultsForSearchController(searchController: UISearchController) 
{ 
    filteredTableData.removeAll(keepCapacity: false) 
    let searchPredicate = NSPredicate(format: "SELF contains[c] %@", searchController.searchBar.text) 
    let array = tableData.filteredArrayUsingPredicate(searchPredicate) 
    filteredTableData = array as! [String] 

    self.tableView.reloadData() 
} 

而且我真的不知道该怎么做搜索的数组是这样的:

(
    { 
    id = 3; 
    name = TestNewYork; 
    }, 
    { 
    id = 2; 
    name = TestLA; 
    }, 
    { 
    id = 1; 
    name = TestWashington; 
    } 
) 

tableData = []filteredTableData必须是一个数组太

请帮忙!

回答

3

您可以使用一个简单的过滤功能来做到这一点...

tableData : [[String : String]] = ... // your JSON array of String, String dictionaries... 

filteredTableData = tableData.filter{ 
    dictionary in 
    return dictionary["name"] == filterString 
} 

类似的东西,无论如何,不​​写斯威夫特一会儿。

你可以用它的功能太...

func filter(array : [[String : String]], byString filterString : String) -> [[String : String]] { 
    return array.filter{ 
     dictionary in 
     return dictionary["name"] == filterString 
    } 
} 

什么的。尚未检查代码。如果不起作用,会回来。

经过在游乐场和这个作品......

enter image description here

UPDATE

更改为此...

let data = [ 
    [ 
     "id" : 3, 
     "name" : "a" 
    ], 
    [ 
     "id" : 4, 
     "name" : "b" 
    ], 
    [ 
     "id" : 5, 
     "name" : "c" 
    ] 
] 

let filteredData = data.filter{ 
    return $0["name"] == "b" 
} 

和它的作品。只是不能解决如何包装在一个函数中。

如果你想匹配单词的开头...

let data = [ 
    [ 
     "id" : 3, 
     "name" : "Hello" 
    ], 
    [ 
     "id" : 4, 
     "name" : "Goodbye" 
    ], 
    [ 
     "id" : 5, 
     "name" : "Everybody" 
    ] 
] 

let filteredData = data.filter{ 
    let string = $0["name"] as! String 

    return string.hasPrefix("Goo") 
} 

如果你想有一个包含你只需要做一个找到的字符串中。

再一次,我不是在这里躺着。我运行它在一个游乐场检查...

对于一个包含搜索,你可以做到这一点...

let filteredData = data.filter{ 
    let string = $0["name"] as! String 

    return string.rangeOfString("db") != nil 
} 

enter image description here

+0

这不是为我工作,因为ID是INT = /我试图改变值的类型为AnyObject,但在这种情况下,你的func不起作用=/ –

+0

因此更新函数... – Fogmeister

+0

已经... func filter(array:[[String:AnyObject]], byString filterString:String) - > [[String:AnyObject]] { return array.filter { 字典在 返回字典[“name”] == filterString } } –