web-dev-qa-db-fra.com

Swift 3 filtrer un tableau d'objets avec des éléments de tableau

array1 = array1.filter{ $0.arrayInsideOfArray1.contains(array2[0]) }

Le code ci-dessus fonctionne, mais j'essaie de vérifier si tous les éléments de $ 0.arrayInsideOfArray1 correspondent à tous les éléments de array2 et pas seulement [0]

Exemple:

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]) }

Ce que je veux, c'est tout utilisateur qui a un animal de compagnie répertorié dans le fichier petArr!

16
NikaE

Une approche consiste à mettre à jour votre filtre pour voir si une valeur dans pets est dans le tableau petArr:

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

La première $0 provient du filter et il représente chaque User.

La deuxième $0 est du premier contains et représente chaque animal de compagnie dans le tableau pets du User actuel.

36
rmaddy

Si les éléments à l'intérieur du tableau interne sont Equatable, vous pouvez simplement écrire: array1 = array1.filter{ $0.arrayInsideOfArray1 == array2 }

Si ce n'est pas le cas, vous pouvez les créer en adoptant le protocole Equatable et en implémentant func ==(lhs: YourType, rhs: YourType) -> Bool

3
Zapko