我有一个allMenuItems数组,如下所示,我正在尝试从ID数组中进行过滤。在Swift中如何实现?我对高阶函数有一定的了解,但到目前为止,我还无法成功过滤此函数。谢谢您提出任何有关如何实现这一目标的指示。
struct MenuItems {
var id: String
var name: String
init() {
self.id = ""
self.name = ""
}
}
var m1 = MenuItems()
m1.id = "1"
m1.name = "Name 1"
var m2 = MenuItems()
m2.id = "2"
m2.name = "Name 2"
var m3 = MenuItems()
m3.id = "3"
m3.name = "Name 3"
var allMenuItems: [MenuItems] = [m1, m2, m3] // [{id "1", name "Name 1"}, {id "2", name "Name 2"}, {id "3", name "Name 3"}]
var anArrayOfIds: [String] = ["1", "3"]
过滤后的输出为:
var filteredMenuItems: [MenuItems] = [m1, m3] // [{id "1", name "Name 1"}, {id "3", name "Name 3"}]
有什么建议吗?
答案 0 :(得分:2)
怎么样
let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id)}
这给了我1和3的项目。
我已经自由地更新了一些代码:
struct MenuItems {
let id: String
let name: String
}
let m1 = MenuItems(id: "1", name: "Name 1")
let m2 = MenuItems(id: "2", name: "Name 2")
let m3 = MenuItems(id: "3", name: "Name 3")
let allMenuItems = [m1, m2, m3]
let anArrayOfIds: [String] = ["1", "3"]
let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id)}
希望有帮助
答案 1 :(得分:2)
您可以这样做:
let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id) }
我建议你:
id
设为整数let
代替var
,contains
方法将是 O(1)而不是 O(n)。实施所有这些建议将为您提供以下代码:
struct MenuItems {
let id: Int
let name: String
}
let m1 = MenuItems(id: 1, name: "Name 1")
let m2 = MenuItems(id: 2, name: "Name 2")
let m3 = MenuItems(id: 3, name: "Name 3")
let allMenuItems: [MenuItems] = [m1, m2, m3]
var aSetOfIds: Set<Int> = [1, 3] //I used a var if aSetOfIds could be changed
var filteredMenuItems = allMenuItems.filter { aSetOfIds.contains($0.id) }
答案 2 :(得分:1)
您可以使用过滤器并包含
let filtered = allMenuItems.filter( { anArrayOfIds.contains($0.id) })
答案 3 :(得分:1)
首先,请不要在类似的结构中使用奇怪的语法
init() {
self.id = ""
self.name = ""
}
删除init
方法并使用隐式成员初始化器创建项目,通过这种方式,您应以单数形式表示代表单个对象的结构:
let m1 = MenuItem(id: "1", name: "Name 1")
您甚至可以将成员声明为常量
struct MenuItem {
let id, name : String
}
不要注释编译器可以推断的类型。
使用
用id
个值的另一个数组过滤该数组
let filteredMenuItems = allMenuItems.filter{ anArrayOfIds.contains($0.id) }