我该如何优化此搜索功能?

时间:2015-06-28 03:35:14

标签: ios arrays swift

我正在思考如何使我的搜索功能更加优化。所以我有一种情况,我从SQLITE数据库加载一个对象数组。基本上,数组中的一个元素具有可以访问的多个属性。在数组的一个元素内,您有时间和房间等属性。我想让搜索变得灵活,而无需用户过滤他们正在搜索的内容。我不喜欢我的实现是我过滤时间和空间,然后我循环过滤数组并将它们添加到一般的“searchArrayToDisplay”。我认为for循环是浪费的。我想知道是否有一种方法可以将过滤后的元素附加到一般的“searchArrayToDisplay”而不必循环?下面的方法通常很快,但我认为有一种更好的方法,我只是没有看到。希望我很清楚。谢谢你的帮助!

<button type = "button" onclick = "whoIsRdns(this)" class="dns-information btn btn-xs btn-info pull-right" data-toggle="modal" data-target = "#whois_rdns_modal" data-path="{{ path( '_who_is_rdns', { 'peer': peer.number, 'ip': peer.mac } ) }}" data-hi = "hi2">
<i class="icon-search"></i>
</button>

2 个答案:

答案 0 :(得分:0)

使用逻辑OR运算符。像这样

let filteredTimeAndRooms = searchArray.filter { model in

    let foundTime = model.time?.rangeOfString(searchString) != nil
    let foundRoom = model.roomName?.rangeOfString(searchString) != nil

    return foundTime || foundRoom
}

searchArrayToDisplay = filteredTimeAndRooms

答案 1 :(得分:0)

只需将两个比较合并为一个,并在提早返回时要小心:

let searched = searchArray.filter { (prod : ProductModel) -> Bool in
    if let room = prod.roomName {
        if room.rangeOfString(searchString, options: .CaseInsensitiveSearch, range: nil, locale: nil) != nil {
            return true
        }
    }
    if let text = prod.customText1 {
        return text.rangeOfString(searchString, options: .CaseInsensitiveSearch, range: nil, locale: nil) != nil
    }
    return false
}

您可以通过searchArrayToDisplay = searchArray.filter {...}直接指定,也可以通过searchArrayToDisplay += searched追加数组。