Swift 过滤嵌套数组
Swift Filter Nested Array
我有一个 NSMutableArray
,里面有很多数组。在所有索引处的每个数组中,他们还具有下面给出的 class 的自定义对象。
Class User:NSObject{
var name = ""
var userName = ""
var email = ""
var age = 0
var gender = ""
var
}
我想针对两个对象过滤此嵌套数组。
例如,如果用户在搜索栏中键入一些文本,并在该嵌套数组中检查该文本是否与名称或用户名或两者匹配。
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")
}
}
}
这里有一个更 "swiftly" 的方法,可以使用 Array
提供的 filter(_:)
方法。
方法:
func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]
实施:
// Create some generic objects to test on
let object1 = User()
object1.name = "John"
object1.userName = "jdoe"
let object2 = User()
object2.name = "Jane"
object2.userName = "jdoe"
let object3 = User()
object3.name = "Bob"
object3.userName = "bjones"
// Add them to a test array
var objects = [[]]
objects.append([object1])
objects.append([object2])
objects.append([object3])
// What we want to search on
let searchString = "j"
// Filter the array
for array in objects {
let searchedSubArray = array.filter {
return [=11=].name.rangeOfString(searchString, options: .CaseInsensitiveSearch) != nil ||
[=11=].userName.rangeOfString(searchString, options: .CaseInsensitiveSearch) != nil
}
if (searchedSubArray.count > 0) {
print("we found a match!")
}
}
let nestedArray: [[User]] = [[user1, user2], [user3], [user4, user5]]
let searchName = "foo"
let filteredArray = nestedArray.map({
return [=10=].filter({ [=10=].name == searchName })
}).filter({ [=10=].count > 0 })
这是一种纯函数式方法,它会生成一个新的嵌套数组,该数组仅包含具有匹配用户的数组,并且这些数组也将仅包含匹配用户。
几点建议
结构更适合模型值
struct User {
let name: String
let userName: String
let email: String
let age: Int
let gender: String
}
不要使用 NSMutableArray
NSMutableArray
是一个 Objective-C class。您可以通过 Swift 访问它,但您应该使用 Swift 数组结构。它速度更快,并且作为一种值类型,可以防止与代码的多个部分访问共享对象相关的错误。
过滤您的数据
现在给定一个User
数组的数组
let data: [[User]] = ...
和一个关键字
let keyword: String = ...
你可以过滤你的数据写入
let matchingUsers = data
.flatMap { [=13=] }
.filter { [=13=].name.range(of: keyword) != nil || [=13=].userName.range(of: keyword) != nil }
现在 matchingUsers
是 User(s)
的数组,其中 name
或 username
包含 keyword
。
matteok 建议的略微改进版本:
在这种过滤中忽略寄存器是有意义的,而不是检查查找目标是否包含搜索查询的相等性检查
另外使用 ![=11=].isEmpty
比检查 [=12=].count > 0
更快捷
let nestedArray: [[User]] = [[user1, user2], [user3], [user4, user5]]
let searchName = "foo".lowercased()
let filteredArray = nestedArray
.map { [=10=].filter { [=10=].name.lowercased().contains(searchName) }}
.filter { ![=10=].isEmpty }
我有一个 NSMutableArray
,里面有很多数组。在所有索引处的每个数组中,他们还具有下面给出的 class 的自定义对象。
Class User:NSObject{
var name = ""
var userName = ""
var email = ""
var age = 0
var gender = ""
var
}
我想针对两个对象过滤此嵌套数组。 例如,如果用户在搜索栏中键入一些文本,并在该嵌套数组中检查该文本是否与名称或用户名或两者匹配。
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")
}
}
}
这里有一个更 "swiftly" 的方法,可以使用 Array
提供的 filter(_:)
方法。
方法:
func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]
实施:
// Create some generic objects to test on
let object1 = User()
object1.name = "John"
object1.userName = "jdoe"
let object2 = User()
object2.name = "Jane"
object2.userName = "jdoe"
let object3 = User()
object3.name = "Bob"
object3.userName = "bjones"
// Add them to a test array
var objects = [[]]
objects.append([object1])
objects.append([object2])
objects.append([object3])
// What we want to search on
let searchString = "j"
// Filter the array
for array in objects {
let searchedSubArray = array.filter {
return [=11=].name.rangeOfString(searchString, options: .CaseInsensitiveSearch) != nil ||
[=11=].userName.rangeOfString(searchString, options: .CaseInsensitiveSearch) != nil
}
if (searchedSubArray.count > 0) {
print("we found a match!")
}
}
let nestedArray: [[User]] = [[user1, user2], [user3], [user4, user5]]
let searchName = "foo"
let filteredArray = nestedArray.map({
return [=10=].filter({ [=10=].name == searchName })
}).filter({ [=10=].count > 0 })
这是一种纯函数式方法,它会生成一个新的嵌套数组,该数组仅包含具有匹配用户的数组,并且这些数组也将仅包含匹配用户。
几点建议
结构更适合模型值
struct User {
let name: String
let userName: String
let email: String
let age: Int
let gender: String
}
不要使用 NSMutableArray
NSMutableArray
是一个 Objective-C class。您可以通过 Swift 访问它,但您应该使用 Swift 数组结构。它速度更快,并且作为一种值类型,可以防止与代码的多个部分访问共享对象相关的错误。
过滤您的数据
现在给定一个User
let data: [[User]] = ...
和一个关键字
let keyword: String = ...
你可以过滤你的数据写入
let matchingUsers = data
.flatMap { [=13=] }
.filter { [=13=].name.range(of: keyword) != nil || [=13=].userName.range(of: keyword) != nil }
现在 matchingUsers
是 User(s)
的数组,其中 name
或 username
包含 keyword
。
matteok 建议的略微改进版本:
在这种过滤中忽略寄存器是有意义的,而不是检查查找目标是否包含搜索查询的相等性检查
另外使用 ![=11=].isEmpty
比检查 [=12=].count > 0
let nestedArray: [[User]] = [[user1, user2], [user3], [user4, user5]]
let searchName = "foo".lowercased()
let filteredArray = nestedArray
.map { [=10=].filter { [=10=].name.lowercased().contains(searchName) }}
.filter { ![=10=].isEmpty }