在字典数组中搜索

时间:2015-05-12 11:02:31

标签: swift ios8

我正在尝试搜索从JSON获得的字典数组中的值。我有tableViewController UISearchResultsUpdating。我找到了一个带字符串数组的例子:

    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也必须是数组

请帮忙!

1 个答案:

答案 0 :(得分:6)

您可以使用简单的过滤功能来执行此操作...

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

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

无论如何都是这样的,不是写了一段时间的Swift。

你也可以将它包装在一个函数中......

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

或者其他什么。尚未检查代码。如果它不起作用将会回来。

在Playground检查,这有效......

enter image description here

<强>更新

改为此...

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