按 属性 筛选对象数组,使用 Swift 中的值数组
Filter an array of objects by property, using an array of values in Swift
使用值数组根据对象的一个属性过滤对象数组的最有效方法是什么?我可以遍历这些项目,但我不禁想到使用 Array.filter 和 Array.contains 有一种非常有效的方法 - 我只是不够熟练 Swift 能够把拼凑起来。
例如,如果我有一个包含 Book 对象的数组,每个对象都有一个字符串作者 属性,我该如何过滤它以仅显示 John Smith、Arthur Price 或 David Jones 的书籍?
大致如下:
Class Book {
var author : String = String()
}
var books : Array = [Book]()
//books added elsewhere
let authors = ["John Smith", "Arthur Price", "David Jones"]
let filteredBooks = books.filter({authors.contains({([=12=] as Book).author})})
我建议您按作者制作图书索引:
let book = Book(author: "Arsen")
let bookIndex = [book.author: [book]]
现在您可以非常快速地访问按作者过滤的图书:
bookIndex["Arsen"] // => [Books]
对于多位作者:
var results = [Book]()
for author in authors {
if let books = bookIndex[author] {
results += books
}
}
results
这是我在游乐场工作的,为什么这不好?
class Book {
var author = String()
init(author:String){
self.author = author
}
}
var allBooks: [Book] = []
allBooks.append(Book(author: "John Smith"))
allBooks.append(Book(author: "Arthur Price"))
allBooks.append(Book(author: "David Jones"))
allBooks.append(Book(author: "Somebody Else"))
let authors = ["Arthur Price", "David Jones"]
let filteredBooks = allBooks.filter({authors.contains([=10=].author)})
filteredBooks // [{author "Arthur Price"}, {author "David Jones"}]
你也可以使用像
这样的东西
let authorsAndBooks = authors.map { (authorName) -> (String, [Book]) in (authorName, allBooks.filter({ [=10=].author == authorName })) }
这将是元组数组,第一个元素是作者姓名,第二个元素是他的书的数组,以防作者写了不止一本书。
使用值数组根据对象的一个属性过滤对象数组的最有效方法是什么?我可以遍历这些项目,但我不禁想到使用 Array.filter 和 Array.contains 有一种非常有效的方法 - 我只是不够熟练 Swift 能够把拼凑起来。
例如,如果我有一个包含 Book 对象的数组,每个对象都有一个字符串作者 属性,我该如何过滤它以仅显示 John Smith、Arthur Price 或 David Jones 的书籍?
大致如下:
Class Book {
var author : String = String()
}
var books : Array = [Book]()
//books added elsewhere
let authors = ["John Smith", "Arthur Price", "David Jones"]
let filteredBooks = books.filter({authors.contains({([=12=] as Book).author})})
我建议您按作者制作图书索引:
let book = Book(author: "Arsen")
let bookIndex = [book.author: [book]]
现在您可以非常快速地访问按作者过滤的图书:
bookIndex["Arsen"] // => [Books]
对于多位作者:
var results = [Book]()
for author in authors {
if let books = bookIndex[author] {
results += books
}
}
results
这是我在游乐场工作的,为什么这不好?
class Book {
var author = String()
init(author:String){
self.author = author
}
}
var allBooks: [Book] = []
allBooks.append(Book(author: "John Smith"))
allBooks.append(Book(author: "Arthur Price"))
allBooks.append(Book(author: "David Jones"))
allBooks.append(Book(author: "Somebody Else"))
let authors = ["Arthur Price", "David Jones"]
let filteredBooks = allBooks.filter({authors.contains([=10=].author)})
filteredBooks // [{author "Arthur Price"}, {author "David Jones"}]
你也可以使用像
这样的东西let authorsAndBooks = authors.map { (authorName) -> (String, [Book]) in (authorName, allBooks.filter({ [=10=].author == authorName })) }
这将是元组数组,第一个元素是作者姓名,第二个元素是他的书的数组,以防作者写了不止一本书。