Arrays 使用Swift中的值数组,按属性筛选对象数组
使用值数组根据对象的属性之一过滤对象数组的最有效方法是什么?我可以反复浏览这些项目,但我忍不住认为使用Array.filter和Array.contains是一种非常有效的方法——我只是对Swift不够精通,无法将各个部分组合在一起 例如,如果我有一个包含Book对象的数组,其中每个对象都有一个String author属性,我将如何过滤它以仅显示John Smith、Arthur Price或David Jones的书籍 大致如下:Arrays 使用Swift中的值数组,按属性筛选对象数组,arrays,swift,filter,contains,Arrays,Swift,Filter,Contains,使用值数组根据对象的属性之一过滤对象数组的最有效方法是什么?我可以反复浏览这些项目,但我忍不住认为使用Array.filter和Array.contains是一种非常有效的方法——我只是对Swift不够精通,无法将各个部分组合在一起 例如,如果我有一个包含Book对象的数组,其中每个对象都有一个String author属性,我将如何过滤它以仅显示John Smith、Arthur Price或David Jones的书籍 大致如下: Class Book { var author :
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({($0 as Book).author})})
我建议您按作者编制图书索引:
let book = Book(author: "Arsen")
let bookIndex = [book.author: [book]]
bookIndex["Arsen"] // => [Books]
现在,您可以以难以置信的速度访问按作者筛选的书籍:
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($0.author)})
filteredBooks // [{author "Arthur Price"}, {author "David Jones"}]
你也可以用类似的东西
let authorsAndBooks = authors.map { (authorName) -> (String, [Book]) in (authorName, allBooks.filter({ $0.author == authorName })) }
这将创建一个元组数组,第一个元素是作者姓名,第二个元素是他的书籍数组,以防作者写了不止一本书。您需要最简单的方法还是最有效的方法?例如,如果最有效,则需要首先准备数据,并使用键(搜索字段和值)
Book
对象将数组转换为字典。在此操作之后,您的搜索将是最重要的effective@Alex,您将如何将该方法应用于我刚才添加的命令?您使用的是数组,在这种情况下,搜索可能不会尽可能快,要尽可能快,您需要使用字典。如果您需要快速搜索,请参阅下面来自Arsen的答案,这里有一个我的意思示例。这看起来很有趣,但您如何使用索引按多个值进行筛选?@Jon Paul查看更新。我认为它可以用map
和flatmap
以一行的形式编写,但仍然是非常有效的方法谢谢-这比我建议的使用数组更快?说清楚,我不需要它尽可能快。我只是对在学习Swift时使用最佳设计模式感兴趣。:)每次,你都会多次使用相应的图书数组获得相同的authorName。