Rik
Rik

Reputation: 1987

filter array based on another

I have two arrays, one an array of array of profiles and one of the section names:

var sections: [Array<Profile>] = [friends, contacts, other]
var sectionNames = ["Friends", "Contacts", "Other Users"]

How do I filter the names based on whether the sections are empty? I get an error when I try the code below:

sectionNames.filter { index, _ in
    sections[index].count > 0
}

Contextual closure type '(String) throws -> Bool' expect 1 argument, but two given

Upvotes: 0

Views: 63

Answers (2)

Cristik
Cristik

Reputation: 32793

You can use zip and compactMap:

let nonEmptySections = zip(sections, sectionNames).compactMap { $0.isEmpty ? nil : $1 }

Using zip has the advantage that you don't get crashes if the two arrays have different sizes. On the other hand, it can lead to subtle bugs.

I'd recommend that you use a data structure to model you data instead:

struct Section {
    let name: String
    let profiles: [Profile]
}

This should ease the way you process the sections in your app. And by using @Alexander's suggestion, you can add an isEmpty property to the struct, making it even easier to use

extension Section {
    var isEmpty: Bool { return profiles.isEmpty }
}

... later in the code

let nonEmptySections = sections.filter { !$0.isEmpty }

Upvotes: 2

Andre Liberty
Andre Liberty

Reputation: 757

you can try something like this

var ar1:[Array<Int>] = [[1,2],[3,4,],[],[5,6]]
var ar2 = [1,2,3,4]
ar2 = (0 ..< ar1.count).filter {ar1[$0].count > 0}.map {ar2[$0]}
print(ar2) // [1, 2, 4]

Upvotes: 0

Related Questions