如何在Swift中从字符串数组中过滤对象

时间:2018-12-05 21:32:36

标签: arrays swift

我有一个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"}]

有什么建议吗?

4 个答案:

答案 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
  • 将anArrayOfIds设置为集合而不是数组,因为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) }