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

Code above works but I'm trying to check if all the elements of $0.arrayInsideOfArray1 match with all the elements of array2 not just [0]

Example:

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

What I want is any user that has any pet listed in the petArr!

5
  • You still haven't explained what results your expect to get with the code you posted. Commented Apr 7, 2017 at 2:37
  • print(user) prints: (name: "testUset", age: 43, hasPet: true, pets: ["cat", "dog", "rabbit"])] But the result I wanted to get in this case would be: User(name: "testUset", age: 43, hasPet: true, pets: ["cat", "dog", "rabbit"])] User(name: "testUset1", age: 36, hasPet: true, pets:["rabbit"])] Commented Apr 7, 2017 at 2:42
  • So what you want is any user that has any pet listed in the petArr, correct? Commented Apr 7, 2017 at 2:46
  • Then please update your question to make that clear. Update your question to show the results you want. Commented Apr 7, 2017 at 2:49
  • 1
    @NikaE you should declare all properties of your structure as constantes and get rid of your IUO in all of them. structures don't require you to create its initializers. struct User { let name: String let age: Int let hasPet: Bool let pets: [String] } Commented Apr 7, 2017 at 14:27

2 Answers 2

67

One approach is to update your filter to see if any value in pets is in the petArr array:

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

The first $0 is from the filter and it represents each User.

The second $0 is from the first contains and it represents each pet within the pets array of the current User.

Sign up to request clarification or add additional context in comments.

1 Comment

The second $0 is optional, writing where: petArr.containsis enough. 😉
4

If elements inside the internal array are Equatable you can just write:

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

If they are not, you can make them, by adopting Equatable protocol and implementing:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.