【问题标题】:filtering array in swift快速过滤数组
【发布时间】:2015-10-27 18:35:39
【问题描述】:

如何通过一个或多个标志过滤一组自定义对象?

let flags = ["New product", "Season 2014", "Season 2015", "Product available"]

一个或多个静态标志很容易:

let filteredArray = myCustomObjectsArray.filter() { $0.isNew == true }

let filteredArray = myCustomObjectsArray.filter() { $0.isNew == true && $0.season.rangeOfString("14") && $0.season.rangeOfString("15") && $0.isAvailable }

但是如果标志是动态的,即标志数组是通过用户点击表格视图的单元格来创建的呢?

其他问题是在 `filter() { condition1 && condition2 etc.} 中尝试连接多个条件时出错。 “表达很复杂,需要在合理的时间内解决……”。

所以,flags 数组是用户选择的(只是来自 tableview 单元格的标题)。如果标志数组是 ["New product", "Season 2015"],我想过滤 .isNew 和 .season.rangeOfString("15") 例如。所以我是按属性而不是按字符串排序的。

【问题讨论】:

  • 您确实应该提供更准确地代表您的问题的代码,很难完全理解您在这里要完成的工作。您似乎需要使用flags 数组来过滤myCustomObjectsArray 数组。目前我们只能假设如何您想要过滤,您是否尝试使用flags 数组中的字符串根据对象的season 使用rangeOfString 进行过滤?或者是别的什么?请更具体。
  • 好的。我发布了一些示例来代表我想要的,但可能不清楚。对此感到抱歉。所以.. flags 数组是用户选择的(只是来自 tableview 单元格的标题)。如果标志数组是 ["New product", "Season 2015"],我想过滤 .isNew 和 .season.rangeOfString("15") 例如。所以按属性而不是按字符串排序。

标签: ios arrays swift filtering


【解决方案1】:

对于多个条件,请尝试以下代码。可能对你有帮助。

let tryAnchoredFirst = array1.filter { (text) -> Bool in
            let tmp: NSString = text

            var range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch )
            return range.location != NSNotFound
        }
        // If the result of the filter is zero for first case then it will go to else part
        if tryAnchoredFirst.count > 0 {
            self.filteredTableData = tryAnchoredFirst
        }
        else {

            // Check second array
            self.filteredTableData = array2.filter { (text) -> Bool in

                let tmp: NSString = text
                var range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
                return range.location != NSNotFound
            }
        }

【讨论】:

    【解决方案2】:

    您还没有发布所有必要的代码,.isNew.season 来自哪里?它似乎是自定义对象。

    您提到的错误(“表达式太复杂,无法在合理的时间内解决”)已经有了答案:

    If condition failing with expression too complex

    话虽如此,您应该能够通过将表达式的每个部分分成单独的语句来解决此问题:

    let filteredArray = myCustomObjectsArray.filter() {
        let isNew = $0.isNew == true
        let is14 = $0.season.rangeOfString("14")
        let is15 = $0.season.rangeOfString("15")
        let isAvailable = $0.isAvailable
        return isNew && is14 && is15 && isAvailable
    }
    

    【讨论】:

    • 就像我说的,我有一个自定义对象数组。每个对象都有“isNew”、“season”等属性。
    【解决方案3】:

    你的数组是:

    var flags = ["New product", "Season 2014", "Season 2015", "Product available"]
    

    首先你声明filteredArray

    var filteredArray : [String] = [String]()
    

    创建一个方法rangeString 来检查字符串是否可用。

    func rangeString(x : String) -> [String]
        {
            if x.rangeOfString("Season") != nil {
    
                filteredArray += [x]
            }
            return filteredArray
        }
    

    现在调用如下函数

    flags.map({x in self.rangeString(x)})
    

    打印你的filteredArray并得到结果。

     println(filteredArray)
    

    注意:对数组中的两个字符串检查应用相同的想法。

    Filter array

    【讨论】:

    • 好吧,我不是要对标志数组进行排序。 flags 数组实际上是在 filter() 方法中使用的所有选定过滤器。所以,过滤后的数组是 [CustomObject]()。
    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多