Skip to content

Instantly share code, notes, and snippets.

@victorBaro
Created December 12, 2018 16:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save victorBaro/828dcd756f92f70db8215a450fd15a5e to your computer and use it in GitHub Desktop.
Save victorBaro/828dcd756f92f70db8215a450fd15a5e to your computer and use it in GitHub Desktop.
Array extension for grouping its values
extension Array {
func grouped<T: Equatable>(by value: (Element) -> T) -> [[Element]] {
var result = [[Element]]()
for element in self {
var foundIndex: Int?
for (index, internalArray) in result.enumerated() {
if let firstValue = internalArray.first, value(firstValue) == value(element) {
foundIndex = index
continue
}
}
foundIndex == nil ? result.append([element]) : result[foundIndex!].append(element)
}
return result
}
}
@victorBaro
Copy link
Author

Examples

let ints = [1,2,3,1,2,3,3,3]
let intsGrouped = ints.grouped(by: { $0 })
print(intsGrouped)

let dates = [Date(), Date().addingTimeInterval(-86400), Date().addingTimeInterval(-86400)]
let datesGrouped = dates.grouped(by: {$0.day})
print(datesGrouped)

intsGrouped:
[[1, 1], [2, 2], [3, 3, 3, 3]]

datesGrouped:
[[2018-12-12 16:20:05], [2018-12-11 16:20:05, 2018-12-11 16:20:05]]

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