Swift 过滤器嵌套数组

Ahs*_*iaz 3 nsmutablearray ios swift

我有一个NSMutableArray它自己里面有很多数组。在所有索引处的每个数组中,它们进一步具有下面给出的类的自定义对象。

Class User:NSObject{
    var name = ""
    var userName = ""
    var email = ""
    var age = 0
    var gender = ""
    var 
}
Run Code Online (Sandbox Code Playgroud)

我想根据两个对象过滤这个嵌套数组。例如,如果用户在 searchBar 中键入一些文本并检查该嵌套数组中的文本,如果该文本与名称或用户名或两者匹配。

mat*_*eok 6

let nestedArray: [[User]] = [[user1, user2], [user3], [user4, user5]]

let searchName = "foo"
let filteredArray = nestedArray.map({
        return $0.filter({ $0.name == searchName })
    }).filter({ $0.count > 0 })
Run Code Online (Sandbox Code Playgroud)

这是一种纯函数式方法,它会生成一个新的嵌套数组,该数组仅包含具有匹配用户的数组,并且这些数组也将仅包含匹配的用户。


Luc*_*tti 6

一些建议

结构体更适合模型值

struct User {
    let name: String
    let userName: String
    let email: String
    let age: Int
    let gender: String
}
Run Code Online (Sandbox Code Playgroud)

不要使用 NSMutableArray

NSMutableArray是一个 Objective-C 类。您可以通过 Swift 访问它,但应该使用 Swift 数组结构。它速度更快,并且作为一种值类型,可以防止与访问共享对象的代码的多个部分相关的错误。

过滤您的数据

现在给定一个数组的数组User

let data: [[User]] = ...
Run Code Online (Sandbox Code Playgroud)

和一个关键字

let keyword: String = ...
Run Code Online (Sandbox Code Playgroud)

你可以过滤你的数据写入

let matchingUsers = data
    .flatMap { $0 }
    .filter { $0.name.range(of: keyword) != nil || $0.userName.range(of: keyword) != nil }
Run Code Online (Sandbox Code Playgroud)

NowmatchingUsers是一个数组,User(s)其中nameusername包含keyword


tor*_*ers 3

let textToSearch:String = "some text"

for nestedArray in myArray {

    for item:User in nestedArray
    {
        if user.name.contains(textToSearch) || user.userName.contains(textToSearch)
        {
            print("found")
        }
    }

}
Run Code Online (Sandbox Code Playgroud)