Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用Swift中的值数组,按属性筛选对象数组_Arrays_Swift_Filter_Contains - Fatal编程技术网

Arrays 使用Swift中的值数组,按属性筛选对象数组

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 :

使用值数组根据对象的属性之一过滤对象数组的最有效方法是什么?我可以反复浏览这些项目,但我忍不住认为使用Array.filter和Array.contains是一种非常有效的方法——我只是对Swift不够精通,无法将各个部分组合在一起

例如,如果我有一个包含Book对象的数组,其中每个对象都有一个String author属性,我将如何过滤它以仅显示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({($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。