Skip to content

Instantly share code, notes, and snippets.

@aryaxt
Last active February 4, 2020 13:55
Show Gist options
  • Save aryaxt/ed9de5b14956df6f0efa to your computer and use it in GitHub Desktop.
Save aryaxt/ed9de5b14956df6f0efa to your computer and use it in GitHub Desktop.
Swift Array GroupBy
extension Sequence {
func groupBy<G: Hashable>(closure: (Iterator.Element)->G) -> [G: [Iterator.Element]] {
var results = [G: Array<Iterator.Element>]()
forEach {
let key = closure($0)
if var array = results[key] {
array.append($0)
results[key] = array
}
else {
results[key] = [$0]
}
}
return results
}
}
// Usage
var users: [User]
users.gourpBy { $0.age }
@Quaggie
Copy link

Quaggie commented Dec 14, 2016

Update for Swift 3

extension Array {
    func groupBy<G: Hashable>(groupClosure: (Element) -> G) -> [[Element]] {
        var groups = [[Element]]()
        
        for element in self {
            let key = groupClosure(element)
            var active = Int()
            var isNewGroup = true
            var array = [Element]()
            
            for (index, group) in groups.enumerated() {
                let firstKey = groupClosure(group[0])
                if firstKey == key {
                    array = group
                    active = index
                    isNewGroup = false
                    break
                }
            }
            
            array.append(element)
            
            if isNewGroup {
                groups.append(array)
            } else {
                groups.remove(at: active)
                groups.insert(array, at: active)
            }
        }
        
        return groups
    }
}

@NinoScript
Copy link

This one was closer to what I was looking for: http://stackoverflow.com/a/31220067/1904287

@aryaxt
Copy link
Author

aryaxt commented Jun 10, 2017

Updated code for swift 3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment