【问题标题】:Inner filtering of array doesn't filter swift数组的内部过滤不会快速过滤
【发布时间】:2021-03-25 22:45:19
【问题描述】:

我正在尝试过滤具有数组的结构数组。以下是我正在使用的数据结构。我也想过滤内部数组,但它不起作用

var objects = [SomeObject]()      //array of objects
var filteredObject = [SomeObject]()  //filtered array
var isSearching = false

struct SomeObject {
    var sectionName: String
    var sectionObjects : [History]
}

struct History {
    var firstName: String
    var lastName: Int
}

func searchBar(_ text: String) {
    filteredObject = objects.filter({ (obj: SomeObject) -> Bool in
        return obj.sectionObjects.filter { $0.firstName.contains(text.lowercased())}.isEmpty
    })
    print("====", filteredObject, "fill===")
}


let history = History(firstName: "John", lastName: 1)
let anotherHistroy = History(firstName: "Dee", lastName: 2)
let historyArray = [history, anotherHistroy]

let newObject = SomeObject(sectionName: "Section 1", sectionObjects: historyArray)

objects.append(newObject)
searchBar("Jo") // printing of filtered object should not have another history in it's sectionObjects

【问题讨论】:

  • 您的示例中的 desired 输出是什么,为什么?
  • ==== [test.SomeObject(sectionName: "Section 1", sectionObjects: [test.History(firstName: "John", lastName: 1), test.History(firstName: "Doe", lastName: 2)])] fill=== 这是objects 的内容,这意味着第二个过滤器不起作用。如果sectionObjects 包含searchText,它将返回整个结构而不是过滤它
  • 但没有一个包含“Jn”。那么为什么要过滤掉任何东西呢?
  • history's firstname John 包含 Jn
  • 我看不到它包含在哪里。它有一个J 和一个n,但它没有Jn。问题是你不知道contains 是什么意思吗?尝试打印出"John".contains("Jn") 的结果。你会发现它是假的。它不包含它(在任何意义上,Swift 或我都知道)。

标签: swift filter


【解决方案1】:

您可能正在寻找这样的东西:

func searchBar(_ text: String) {
    filteredObject = []
    for var ob in objects {
        ob.sectionObjects = ob.sectionObjects.filter {
            $0.firstName.contains(text)
        }
        if !ob.sectionObjects.isEmpty {
            filteredObject.append(ob)
        }
    }
    print("====", filteredObject, "fill===")
}

也许可以用reduce(into:) 做得更优雅,但总的来说,最好从准确说出你的意思开始。您可以根据需要进行调整以考虑区分大小写。

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2018-10-24
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多