【问题标题】:Swift 3 filter array of objects with elements of arraySwift 3使用数组元素过滤对象数组
【发布时间】:2017-04-07 00:30:00
【问题描述】:
array1 = array1.filter{ $0.arrayInsideOfArray1.contains(array2[0]) }

上面的代码有效,但我正在尝试检查 $0.arrayInsideOfArray1 的所有元素是否与 array2 的所有元素匹配,而不仅仅是 [0]

例子:

struct User {
    var name: String!
    var age: Int!
    var hasPet: Bool!
    var pets: [String]!
}

var users: [User] = []

users.append(User(name: "testUset", age: 43, hasPet: true, pets: ["cat", "dog", "rabbit"]))
users.append(User(name: "testUset1", age: 36, hasPet: true, pets:["rabbit"]))
users.append(User(name: "testUset2", age: 65, hasPet: true, pets:["Guinea pigs", "Rats"]))

let petArr = ["cat", "dog", "rabbit"]

users = users.filter { $0.pets.contains(petArr[0]) }

我想要的是任何在 petArr 中列出任何宠物的用户!

【问题讨论】:

  • 您还没有解释您希望使用您发布的代码获得什么结果。
  • print(user) prints: (name: "testUset", age: 43, hasPet: true, pets: ["cat", "dog", "rabbit"])] 但结果我在这种情况下想要得到的是: User(name: "testUset", age: 43, hasPet: true, pets: ["cat", "dog", "rabbit"])] User(name: "testUset1",年龄: 36, hasPet: true, pets:["rabbit"])]
  • 那么您想要的是拥有petArr 中列出的任何宠物的任何用户,对吗?
  • 那么请更新您的问题以明确这一点。更新您的问题以显示您想要的结果。
  • @NikaE 您应该将结构的所有属性声明为常量,并在所有这些属性中删除您的 IUO。结构不需要您创建其初始化程序。 struct User { let name: String let age: Int let hasPet: Bool let pets: [String] }

标签: arrays swift


【解决方案1】:

一种方法是更新您的过滤器以查看 pets 中的任何值是否在 petArr 数组中:

users = users.filter { $0.pets.contains(where: { petArr.contains($0) }) }

第一个$0 来自filter,它代表每个User。

第二个$0 来自第一个contains,它代表当前User 的pets 数组中的每个宠物。

【讨论】:

  • 第二个$0是可选的,写where: petArr.contains就够了。 ?
【解决方案2】:

如果内部数组中的元素是Equatable,你可以写:

array1 = array1.filter{ $0.arrayInsideOfArray1 == array2 }

如果不是,您可以通过采用Equatable 协议并实现:

func ==(lhs: YourType, rhs: YourType) -> Bool

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多