Swift 4 - 用数组过滤数组

Swift 4 - Filtering Array with Array

我有一个条目列表,其中有一个 ID,我想将它们过滤为 entry.id 与 selectedIDs 中的一个 ID 匹配的条目。有没有办法用过滤器来做到这一点,还是我必须使用 for 循环?

struct Entry {
    let id: String
}
var allEntries = [Entry]()
var selectedIDs = [String]

例如

allEntries = [Entry(id: "1"), Entry(id:"2"), Entry(id:"3"), Entry(id:"4")]
selectedIDs = ["1", "3"]

// return selectedEntries
var selectedEntries = [Entry(id: "1"), Entry(id: "3")]

根据 selectedIDs 是否包含 id.

过滤 allEntries
var allEntries = [Entry(id: "1"), Entry(id:"2"), Entry(id:"3"), Entry(id:"4")]
var selectedIDs = ["1", "3"]

var selectedEntries = allEntries.filter({ selectedIDs.contains([=10=].id) })

Rakesha Shastri 的回答没有问题。出于性能原因,您可能希望将 selectedIDs 设为 Set 而不是 Array:

let allEntries = [Entry(id: "1"), Entry(id:"2"), Entry(id:"3"), Entry(id:"4")]
let selectedIDs: Set<String> = ["1", "3"]
let selectedEntries = allEntries.filter({ selectedIDs.contains([=10=].id) })

原因是搜索Array的计算复杂度为O(n),其中n是数组的长度,而搜索Set(即a hash table) 平均 O(1) .

  • 如果将 selectedIDs 保留为数组,则整体解决方案的复杂度为 O(n * m),其中 nmselectedIDsallEntries

  • 如果使用Set,整体复杂度降低到O(m)

话虽如此,您的示例对于任何一种方法来说都太微不足道了。

您可以使用map(:) and filter(:)来实现这个

let matchingEntries = allEntries.map({[=10=].id}).filter({selectedIDs.contains([=10=])})

.map 将 return 你只是将 id 作为一个数组,然后 .filter 将使用 selectedIDs

Swift 5.5:

let filteredArray = array.filter { self.selectedIDs.map(\.id).contains([=10=].id) }